2010-06-07 123 views
30

我有一个列表的向量,我使用它们上的unlist。向量中的一些元素是NULLunlist似乎正在放弃它们。防止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 

回答

15

不需要的功能例如这里的问题是,你不能有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

在3.2.2,它看起来像as.numeric( as.character(NULL))返回数字(0)。一个新的方法可能是使用lapply(b,function(x)ifelse(is.null(x),NA,x)) – cylondude 2015-09-08 23:28:55

1

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

感谢您的答案。很明显,我没有手工定义列表,它是由函数返回的。 无论如何在'unlist'之前将NULL更改为NA似乎有诀窍。 – nico 2010-06-07 18:47:50

+0

@nico如果它是你的函数,那么你可以考虑重写它以返回“NA”而不是“NULL”。看看帮助页面上的“NA”和“NULL”来查看这两个对象之间的差异。 – Marek 2010-06-07 21:03:04

+1

@Marek:不,它实际上是通过在'nls'返回的对象列表中应用'coef'返回的列表。其中一些对象为NULL,coef(NULL)返回NULL。 – nico 2010-06-07 21:41:15

29

在这种情况下(一个级别深度列表)这应该也工作:

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

如果您在处理与几个层次上长而复杂的JSON你应该试试这个:

我从nba.com/stats网站提取游戏日志数据。问题是,有些球员有一个NULL值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]]