防止取消列出以删除NULL值

时间:2010-06-07 17:01:55

标签: list r 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 

4 个答案:

答案 0 :(得分:34)

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

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

答案 1 :(得分:25)

这里的问题是你不能在向量中间放置NULL。例如:

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

你可以在中间使用NA。您可以将其转换为字符然后再转换为数字,这会自动将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 `

答案 2 :(得分:2)

指示缺失值的正确方法是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 

答案 3 :(得分:1)

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

我从nba.com/stats网站上提取了游戏日志数据。问题是,一些玩家的3点罚球(大多数是中心)有一个NULL值,jsonlite :: fromJSON似乎很好地处理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]]