2013-11-03 34 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