2010-06-07 218 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]]