将列表行转置为数据框
Transpose list rows into a dataframe
假设这是我的列表结构
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
关于如何完成的任何建议。
谢谢。
两种方法:
1) 使用 data.table-package
有:
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
这是另一个想法,使用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
假设这是我的列表结构
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
关于如何完成的任何建议。
谢谢。
两种方法:
1) 使用 data.table-package
有:
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
这是另一个想法,使用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