以前曾提出类似的问题,但这是不同的。 我有一个列表列表,每个列表在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?
中完成我知道如何将列表转换为数据帧,但不知道如何将列表转换为可变数量的列表。谢谢!
答案 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