合并重新整形的数据框并根据类别复制值

时间:2013-11-03 04:33:49

标签: r

我有以下两个数据框,第一个代表频率,第二个代表个别事件。我正在尝试向第二个数据添加一个列,该数据将第一个数据合并到第二个数据,条件是行/列。

  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,但无法弄清楚如何组合它们。

1 个答案:

答案 0 :(得分: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