基于R中另一个数据帧的索引创建新数据帧

时间:2016-01-29 15:38:22

标签: r indexing dataframe computation

假设数据:

hypo <- data.frame('X1' = c('a','b','a','b','a','b','a','b'),
       'X2' = c('x','x','y','y','x','x','y','y'),
       'X3' = c('m','m','m','m','n','n','n','n'),
       'X4' = c(1,6,4,9,10,7,8,3))

输出:

  X1 X2 X3 X4
1  a  x  m  1
2  b  x  m  6
3  a  y  m  4
4  b  y  m  9
5  a  x  n 10
6  b  x  n  7
7  a  y  n  8
8  b  y  n  3

当X1和X2值相同且X3不同时,您希望找到X4值之间的差异。例如,我们可以使用subset():

为单个值执行此操作
value <- (subset(hypo, X1 == 'a' & X2 == 'x' & X3 == 'm')$X4 
- subset(hypo, X1 == 'a' & X2 == 'x' & X3 == 'n')$X4)
# -9

我们如何才能这样做,以便为X1和X2相同且X3不同的所有实例计算X4值之间的差异?

理想输出:

  X1 X2  m-n 
1  a  x  -9
2  b  x  -1  
3  a  y  -4  
4  b  y   6

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

dplyr非常简单。只需group_by您希望相同的两个变量,然后summarisediff一起减去这两个变量。它默认为n-m,因此将其设为负值以获得m-n:

> library(dplyr)
> hypo %>% group_by(X1, X2) %>% summarise(-diff(X4))
Source: local data frame [4 x 3]
Groups: X1 [?]

      X1     X2 -diff(X4)
  (fctr) (fctr)     (dbl)
1      a      x        -9
2      a      y        -4
3      b      x        -1
4      b      y         6

答案 1 :(得分:2)

这个明确指出它应该计算m-n而不是n-m

 library(dplyr)
 hypo %>% group_by(X1, X2) %>% 
   summarize(`m-n` = X4[X3=="m"] - X4[X3=="n"])