List 防止未列出以删除空值

List 防止未列出以删除空值,list,r,null,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

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

这里的问题是,在向量的中间不能有<代码> null <代码>。例如:

> c(1,NULL,3)
[1] 1 3
你可以在中间使用NA。您可以将其转换为字符,然后再转换为数字,这会自动将空值转换为NA(带有警告):


>b表示缺失值的正确方法是NA(非空)。下面是另一个正在运行的版本:

   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

a[sapply(a,is.null)]如果您正在处理一个具有多个级别的长而复杂的JSON,您应该尝试一下:

我从nba.com/stats网站提取了比赛日志数据。问题是,一些球员的3分罚球(大部分是中锋)值为空,而jsonlite::fromJSON似乎能很好地处理空值:

#### 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]]
#####玩家游戏日志URL:每个玩家玩一个游戏一个记录####

gameLogsURL谢谢你的回答。显然,我不是手工定义列表,它是由函数返回的。不管怎样,在 unList< /Cord>之前将空值更改为NA,似乎是在作弊。“如果NIO是你的函数,那么你可以考虑改写它来返回<代码> NA <代码>,而不是<代码> null < /代码>。查看帮助页上的
NA
NULL
以查看这两个对象之间的差异。@Marek:不,它实际上是通过对
nls
返回的对象列表应用
coef
返回的列表。其中一些对象为NULL,并且
coef(NULL)
返回
NULL
…在3.2.2上,它看起来像是.numeric(as.character(NULL))返回numeric(0)。一种新的方法可能是使用lappy(b,函数(x)ifelse(is.null(x),NA,x))作为@cylondude建议的方法,用sapply代替lappy(或者使用lappy,simplify=TRUE)来获得向量而不是列表。A[sapply(A,函数(x)length(x)=0L)]谢谢@Ferroao这对我来说是有效的,但is.null没有。
a[sapply(a, is.null)] <- NA
unlist(a)
# p1 p2 p1 p2 p1 p2 p1 p2 
#  2  5  3  4 NA NA  4  5
#### 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]]