2013-11-03 54 views
-1

我有兩個以下數據幀,第一個表示頻率,第二個表示單個事件。我試圖添加一列到合併數據的第一個到第二個數據的第二個數據,在行/列的條件。合併重新整形的數據幀並根據類別複製值

event a b c 
     w 0 1 3 
     x 3 4 0 
     y 6 0 4 
     z 0 0 4 

     event person 
     w  b 
     w  b 
     x  a 
     x  b 
     x  b 
     z  c 
     z  a 
     y  b 
     y  c 
     y  a 
     y  c 

counts <- data.frame (event= c("w", "x", "y", "z"), a= c(0, 3, 6, 0), b=c(1, 4, 0, 0), c=c(3, 0, 4, 4)) 
cases <- data.frame(event=c("w", "w", "x", "x", "x", "z", "z", "y", "y", "y", "y"), 
         person=c("b", "b", "a", "b", "b", "c", "a", "b", "c", "a", "c")) 

目標:

case person freq 
    w  b  1 
    w  b  1 
    x  a  3 
    x  b  4 
    x  b  4 
    z  c  0 
    z  a  0 
    y  b  0 
    y  c  4 
    y  a  6 
    y  c  4 

但沒有成功。我能夠使用reshape包生成第一個DF頻率,但無法弄清楚如何組合它們。

+0

試過'merge'? – TheComeOnMan

+1

@Codoremifa:在這個例子中,我沒有看到使用'merge'的策略。謹慎發佈你在想什麼? –

+0

我希望我能正確理解這個問題 - 'library(reshape2); 重熔< - 熔化(計數,id.vars =「事件」); colnames(計數)< - c(「event」,「person」,「freq」); merge(cases,countmelted,all.x = TRUE,by = c(「event」,「person」));' – TheComeOnMan

回答

1

「[」函數可以將兩列矩陣作爲參數引入矩陣對象。這是table的部分倒數。還有一個as.data.frame.table函數。

mcounts <- data.matrix(counts[-1]) 
mcounts[ cbind(cases$event, cases$person)] 
[1] 1 1 3 4 4 4 0 0 4 6 4 
cases$freq <- mcounts[ cbind(cases$event, cases$person)] 
cases 
#------------ 
    event person freq 
1  w  b 1 
2  w  b 1 
3  x  a 3 
4  x  b 4 
5  x  b 4 
6  z  c 4 
7  z  a 0 
8  y  b 0 
9  y  c 4 
10  y  a 6 
11  y  c 4 

這不是一個確切的解決方案,因爲我沒有采取正確拉布勒表的行時間:

> tcounts <- data.matrix(tcounts) 
> class(tcounts) <- 'table' 
> tcounts 
    a b c 
[1,] 0 1 3 
[2,] 3 4 0 
[3,] 6 0 4 
[4,] 0 0 4 
> as.data.frame(tcounts) 
    Var1 Var2 Freq 
1  A a 0 
2  B a 3 
3  C a 6 
4  D a 0 
5  A b 1 
6  B b 4 
7  C b 0 
8  D b 0 
9  A c 3 
10 B c 0 
11 C c 4 
12 D c 4