2014-11-20 46 views
0

假設我有一個像下面這樣的結構:[R處理NULL值,而轉換列表矩陣

data = structure(list(person = structure(list(name = "A, B", 
     gender = "F", dead = NULL), .Names = c("name", 
     "gender", "dead")), person = structure(list(name = "C", 
     gender = "M", dead = "RIP"), .Names = c("name", 
     "gender", "dead"))), .Names = c("person", "person")) 

,我想將其轉換成一個矩陣

data = matrix(unlist(data), nrow = length(data), ncol=length(data[[1]]), byrow = TRUE) 

如何避免回收當使用matrix時甚至在使用base函數之前沒有使用plyrrbind.fill? 結果是:

> data 
    [,1] [,2] [,3] 
[1,] "A, B" "F" "C" 
[2,] "M" "RIP" "A, B" 

,我想獲得NA""其中值是NULL。例如:

> data 
    [,1] [,2] [,3] 
[1,] "A, B" "F" "" 
[2,] "C" "M" "RIP" 

任何幫助,將不勝感激。

回答

1

您可以嘗試stringi包中的新功能stri_list2matrix

library(stringi) 
stri_list2matrix(lapply(data, unlist), byrow=TRUE, fill="") 
#  [,1] [,2] [,3] 
# [1,] "A, B" "F" "" 
# [2,] "C" "M" "RIP" 

還是爲了NA代替"",離開了fill參數

stri_list2matrix(lapply(data, unlist), byrow=TRUE) 
#  [,1] [,2] [,3] 
# [1,] "A, B" "F" NA 
# [2,] "C" "M" "RIP" 

或者,如果你喜歡一個基礎R的答案,以避免你可以把所有length<-第一向量的長度相同的問題。這會將NA附加到所有較短的向量,並使它們與最長向量的長度相同。

len <- max(sapply(data, length)) ## get length of longest vector 
t(sapply(unname(data), function(x) `length<-`(unname(unlist(x)), len))) 
#  [,1] [,2] [,3] 
# [1,] "A, B" "F" NA 
# [2,] "C" "M" "RIP" 
+0

謝謝你的回答。是的,這是訣竅。我使用了「基本」版本。很好地完成:]現在我看到了你的編輯,你更加簡化了它。乾杯! – Marius 2014-11-20 20:03:03