2011-06-07 40 views
2

我使用table命令在R中生成兩個表。我想創建一個表格/數據框/矩陣,使得來自兩個表格的所有名稱都被表示,並且輸出中包含適當的「零」計數。例如如何在R中獲得兩個列表?

我目前擁有的數據看起來是如下

表1

A B C 
1 2 4 

表2

C D E 
3 4 4 

我想有輸出如下:

Table1 Table2 
A  1  0 
B  2  0 
C  4  3 
D  0  4 
E  0  4 

我如何在R中執行此操作?

回答

5

無重塑:

t1 <- table(c("A", rep("B", 2), rep("C", 4))) 
t2 <- table(c(rep("C", 3), rep("D", 4), rep("E", 4))) 

ndf <- merge(t1, t2, by = "Var1", all = TRUE) 
ndf[is.na(ndf)] <- 0 
ndf 
    Var1 Freq.x Freq.y 
1 A  1  0 
2 B  2  0 
3 C  4  3 
4 D  0  4 
5 E  0  4 
+0

通過短短的頭髮打我! ;) – joran 2011-06-07 21:05:13

+0

+1認爲你需要融合之前融化。 – diliop 2011-06-07 21:05:18

+0

謝謝@EDi,這是一個救生員。 – Sam 2011-06-07 21:16:30

3

忽略什麼,我認爲是你的問題一個錯字(該C頻率應爲4和3,權利,而不是2和3?),你可以做到這一點通過強迫數據然後合併:

t1 <- table(rep(LETTERS[1:3],times=c(1,2,4))) 
t2 <- table(rep(c("C","D",'E'),times=c(3,4,4))) 
merge(as.data.frame(t1),as.data.frame(t2),by="Var1",all=T) 

然後將NA轉換爲零。

2

DATA

dat <- list(rep(LETTERS[1:3],times=c(1,2,4)),rep(LETTERS[3:5],times=c(3,2,2))) 

CODE

f <- function(d){ 
     lev <- unique(unlist(d, use.names=FALSE)) 
     d <- lapply(d, factor, levels=lev) 
     r <- do.call(cbind, lapply(d, table)) 
     colnames(r) <- paste("Table", seq(NCOL(r)), sep="") 
     return(r) 
    } 

輸出

f(dat) 
    Table1 Table2 
A  1  0 
B  2  0 
C  4  3 
D  0  2 
E  0  2 
+0

演示如何在R中編寫(和使用)函數的好方法。 – 2011-06-08 10:29:29

+0

嗨!這是一個很好的解決方案和一個很好的演示。謝謝。 – Sam 2011-06-08 11:24:17