2014-11-20 83 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