如何将具有可变列的列表转换为R中的数据帧

时间:2014-09-23 21:04:53

标签: r

以前曾提出类似的问题,但这是不同的。 我有一个列表列表,每个列表在R中都有可变数量的字符串。

现在,我想将此列表转换为数据帧。发布,我想删除那些包含全部0的字符串的行,以及我想要连续删除这些字符串并将其替换为全部为0的NA。

例如,列表是

"110" "111"  
"000" "111" "101"
"0101" "1010" "1111"
"0000"

现在,这将转换为数据帧,如下所示。

"110"  "111"    NA
"000"  "111"   "101"
"0101" "1010"  "1111"
"0000"   NA      NA

在此之后,我将在此数据框中添加两列,我可以轻松完成。并发布,我想删除所有0的行,如行号4和行号2,我将删除第一个条目。

最终结果将是,

1 2 "110"  "111"   NA
2 3  NA    "111"  "101"
3 4 "0101" "1010" "1111"

我怎样才能在R?

中完成

我知道如何将列表转换为数据帧,但不知道如何将列表转换为可变数量的列表。谢谢!

2 个答案:

答案 0 :(得分:2)

听起来rbind.fill.matrix包中的plyr函数可能有助于解决您的问题:

library(plyr)
dat <- list(c("110","111"), 
            c("000", "111", "101"),
            c("0101", "1010", "1111"), 
            c("0000"))
dat
# [[1]]
# [1] "110" "111"
# 
# [[2]]
# [1] "000" "111" "101"
# 
# [[3]]
# [1] "0101" "1010" "1111"
# 
# [[4]]
# [1] "0000"
dat <- lapply(dat, matrix, nrow=1) # convert each string to matrix
dat <- do.call(rbind.fill.matrix, dat) # bind matrices
dat
#       1      2      3     
# [1,] "110"  "111"  NA    
# [2,] "000"  "111"  "101" 
# [3,] "0101" "1010" "1111"
# [4,] "0000" NA     NA    
dat[as.numeric(dat) == 0] <- NA # replace 0's with NA 
dat <- dat[rowSums(!is.na(dat)) > 0,] # discard rows with all 0's
dat <- cbind(c(1,2,3), c(2,3,4), dat) # add two columns
dat <- data.frame(dat) # convert to data.frame
dat
# V1 V2   X1   X2   X3
# 1  1  2  110  111 <NA>
# 2  2  3 <NA>  111  101
# 3  3  4 0101 1010 1111

答案 1 :(得分:1)

创建列表:

myList <- list( a=c("110", "111"), 
            b=c("000", "111", "101"),
            d=c("0101", "1010", "1111"),
            e=c("0000"))

扩展列表对象,使每个对象具有相同的长度:

m <- max(sapply(myList, length))
myList <- lapply(myList, function(x){length(x) <- m;x})

创建data.frame:

myDf <- as.data.frame(do.call("rbind", myList), stringsAsFactors=FALSE)
myDf
    V1   V2   V3
1  110  111 <NA>
2  000  111  101
3 0101 1010 1111
4 0000 <NA> <NA>

再添加两列:

myDf <- cbind(x=1:4, y=2:5, myDf)
myDf
  x y   V1   V2   V3
1 1 2  110  111 <NA>
2 2 3  000  111  101
3 3 4 0101 1010 1111
4 4 5 0000 <NA> <NA>

删除至少有一列包含全零的行:

index <- sapply(myDf, function(x) which(as.numeric(x) == 0))
index <- Reduce(union, index)
index
myDf[-index, ]
  x y   V1   V2   V3
1 1 2  110  111 <NA>
3 3 4 0101 1010 1111