将表组合成数据框

时间:2014-02-10 20:55:34

标签: r dataframe

如何将表格列表转换为数据框?

我有:

> (tabs <- list(table(c('a','a','b')),table(c('c','c','b')),table(c()),table(c('b','b'))))
[[1]]

a b 
2 1 

[[2]]

b c 
1 2 

[[3]]
< table of extent 0 >

[[4]]

b 
2 

我想:

> data.frame(a=c(2,0,0),b=c(1,1,2),c=c(0,2,0))
  a b c
1 2 1 0
2 0 1 2
3 0 0 0 
4 0 2 0 

PS。请假设这些表是由table个来电创建的!他们

4 个答案:

答案 0 :(得分:2)

这假定表是一维的。

all.names <- unique(unlist(lapply(tabs, names)))
df <- as.data.frame(do.call(rbind, 
  lapply(
    tabs, function(x) as.list(replace(c(x)[all.names], is.na(c(x)[all.names]), 0))
) ) )    
names(df) <- all.names
df

可能有一种更清洁的方法。

#   a b c
# 1 2 1 0
# 2 0 1 2
# 3 0 0 0
# 4 0 2 0

答案 1 :(得分:2)

c_names <- unique(unlist(sapply(tabs, names)))
df <- do.call(rbind, lapply(tabs, `[`, c_names))
colnames(df) <- c_names
df[is.na(df)]  <- 0

答案 2 :(得分:2)

tabs <- list(table(c('a','a','b')),table(c('c','c','b')),table(c()),table(c('b','b')))


dat.names <- unique(unlist(sapply(tabs, names)))


dat <- matrix(0, nrow = length(tabs), ncol = length(dat.names))
colnames(dat) <- dat.names


for (ii in 1:length(tabs)) {
   dat[ii, ] <- tabs[[ii]][match(colnames(dat), names(tabs[[ii]]) )]
}

dat[is.na(dat)] <- 0

> dat
     a b c
[1,] 2 1 0
[2,] 0 1 2
[3,] 0 0 0
[4,] 0 2 0

答案 3 :(得分:0)

这是一个非常干净的方法:

library(reshape2)
newTabs <- melt(tabs)
newTabs
#   Var1 value L1
# 1    a     2  1
# 2    b     1  1
# 3    b     1  2
# 4    c     2  2
# 5    b     2  4

newTabs$L1 <- factor(newTabs$L1, seq_along(tabs))
dcast(newTabs, L1 ~ Var1, fill = 0, drop = FALSE)
#   L1 a b c
# 1  1 2 1 0
# 2  2 0 1 2
# 3  3 0 0 0
# 4  4 0 2 0

这利用了melt的{​​{1}}方法(参见list)自动添加变量(L1为已证明的reshape2:::melt.list )标识列表元素的索引。由于您的列表中有一些项目为空,因此它们不会显示在您的解冻列表中,因此您需要list“L1”列,指定所需的级别。 factor负责重组您的输出,并允许您指定所需的dcast值。