假设这是我的列表结构
lst=list(structure(c("level1", "level2", "level4", "level5","18", "abc", "pqr", "lmn"),
.Dim = c(4L, 2L)),
structure(c("level1", "level2", "level3", "level5", "level6", "20", "xyz", "hive", "foo", "bar"),
.Dim = c(5L, 2L)),
structure(c("level1", "level3", "level4", "level5","level6", "22", "dark", "yellow","foobar", "blue"),
.Dim = c(5L, 2L)),
structure(c("level1", "level2", "level3", "level5","level6","level7","24", "dvd", "dxs","glass", "while","though"),
.Dim = c(6L, 2L))
)
期待O / P这样的事情
level1 level2 level3 level4 level5 level6 level7
1) 18 abc NA pqr lmn NA NA
2) 20 xyz hive NA foo bar NA
3) 22 NA dark yellow foobar blue NA
4) 24 dvd dxs NA glass while though
所有列表中的第一列都应该进行转置,因此相应的数据应该被查找到它们的行。
尝试将所有行转置为列本身,从而产生错误
unique(t(list_temp[[c(1,2)]][,1]))
ERROR:Error in list_temp[[c(1, 2)]][, 1] : incorrect number of dimensions
还尝试了
apply(list_temp,1,function(x){list_temp[[x]][,1]})
但是给了我
Error in apply(list_temp, 1, function(x) { :
dim(X) must have a positive length
有关应如何做的任何建议。
感谢。
答案 0 :(得分:4)
两种方法:
1)使用data.table - 包
使用:
library(data.table)
dcast(rbindlist(lapply(lst, as.data.table), idcol = 'id'),
id ~ V1, value.var = 'V2')[, id := NULL][]
你得到:
level1 level2 level3 level4 level5 level6 level7 1: 18 abc NA pqr lmn NA NA 2: 20 xyz hive NA foo bar NA 3: 22 NA dark yellow foobar blue NA 4: 24 dvd dxs NA glass while though
2)使用基础R
使用:
reshape(transform(do.call(rbind.data.frame, lst),
r = rep(seq_along(lst), lengths(lst)/2)),
idvar = 'r', timevar = 'V1', direction = 'wide')[,-1]
你得到:
V2.level1 V2.level2 V2.level4 V2.level5 V2.level3 V2.level6 V2.level7 1 18 abc pqr lmn <NA> <NA> <NA> 5 20 xyz <NA> foo hive bar <NA> 10 22 <NA> yellow foobar dark blue <NA> 15 24 dvd <NA> glass dxs while though
答案 1 :(得分:2)
这是使用Reduce
合并数据帧,然后进行转置并进行一些清理的另一个想法,即
m1 <- t(Reduce(function(...) merge(..., by = 'V1', all = TRUE), lapply(lst, as.data.frame)))
colnames(m1) <- m1[1,]
row.names(m1) <- NULL
final_d <- as.data.frame(m1[-1,], stringsAsFactors = FALSE)
给出,
level1 level2 level4 level5 level3 level6 level7 1 18 abc pqr lmn <NA> <NA> <NA> 2 20 xyz <NA> foo hive bar <NA> 3 22 <NA> yellow foobar dark blue <NA> 4 24 dvd <NA> glass dxs while though