R语言 防止unlist删除NULL值

kjthegm6  于 2023-11-14  发布在  其他
关注(0)|答案(5)|浏览(151)

我有一个列表向量,我在上面使用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

字符串

4sup72z8

4sup72z81#

在这种情况下(一级深度列表),这也应该起作用:

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

字符串

kwvwclae

kwvwclae2#

这里的问题是,你不能让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 `

a11xaf1n

a11xaf1n3#

如果你正在处理一个有几个级别的复杂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]]

字符串

nfg76nw0

nfg76nw04#

使用purrrtidyverse解决方案

a <- map(a, ~ifelse(is.null(.x), NA, .x))
a %>% unlist()

字符串
如果你想一次完成所有事情:

map_vec(a, ~ifelse(is.null(.x), NA, .x))

dohp0rv5

dohp0rv55#

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

字符串

相关问题