2014-02-10 15 views
1

如何將表列錶轉換爲數據框?將表結合到數據框中

我:

> (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調用創建的!他們是而不是

回答

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 
+0

聰明,優雅。不錯 – rawr

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 
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 
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 

這使得使用的事實,那就是爲list S(參見reshape2:::melt.list),其自動添加一個melt方法標識列表元素的索引的變量(未標註的list的L1)。由於您的列表中有一些項目爲空,因此它們不會顯示在您的融化列表中,因此您需要factor「L1」列,指定您想要的級別。 dcast負責重構您的輸出並允許您指定所需的fill值。

相關問題