我有一个列表向量,我使用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
答案 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]]