防止“取消列表”删除 NULL 值

我有一个列表向量,我对它们使用 unlist。向量中的一些元素是 NULL,而 unlist似乎正在丢弃它们。

我怎样才能阻止这一切?

下面是一个简单的(非)工作示例,显示了 unlist多余的特征

a = c(list("p1"=2, "p2"=5),
list("p1"=3, "p2"=4),
list("p1"=NULL, "p2"=NULL),
list("p1"=4, "p2"=5))
unlist(a)
p1 p2 p1 p2 p1 p2
2  5  3  4  4  5
29287 次浏览

这里的问题是你不能让 NULL在一个向量的中间,例如:

> c(1,NULL,3)
[1] 1 3

不过中间可以加个戒毒互助会。您可以将其转换为字符,然后返回到数字,它会自动将 NULL 值转换为 NA (带有警告) :

> b <- as.numeric(as.character(a))
Warning message:
NAs introduced by coercion

然后把名字放回去,因为它们已经被上次的行动删除了:

> names(b) <- names(a)
> b
p1 p2 p1 p2 p1 p2 p1 p2
2  5  3  4 NA NA  4  5 `

表示丢失值的正确方法是 NA (而不是 NULL)。下面是另一个正在工作的版本:

   a = c(list("p1"=2, "p2"=5),
list("p1"=3, "p2"=4),
list("p1"=NA, "p2"=NA),
list("p1"=4, "p2"=5))
unlist(a)


p1 p2 p1 p2 p1 p2 p1 p2
2  5  3  4 NA NA  4  5

在这种情况下(一级深度列表) ,这应该也可以:

a[sapply(a, is.null)] <- NA
unlist(a)
# p1 p2 p1 p2 p1 p2 p1 p2
#  2  5  3  4 NA NA  4  5

如果您正在处理具有多个级别的冗长复杂的 JSON,那么您应该尝试一下:

我从 nba.com/stats 网站提取了游戏日志数据。问题是,有些球员的3分罚球(大部分是中锋)和 jsonlite: : from JSON 似乎能很好地处理 NULL 值:

#### Player game logs URL: one record per player per game played ####
gameLogsURL <- paste("http://stats.nba.com/stats/leaguegamelog?Counter=1000&Direction=DESC&LeagueID=00&PlayerOrTeam=P&Season=2016-17&SeasonType=Regular+Season&Sorter=PTS")


#### Import game logs data from JSON ####
# use jsonlite::fromJSON to handle NULL values
gameLogsData <- jsonlite::fromJSON(gameLogsURL, simplifyDataFrame = TRUE)
# Save into a data frame and add column names
gameLogs <- data.frame(gameLogsData$resultSets$rowSet)
colnames(gameLogs) <- gameLogsData$resultSets$headers[[1]]