根据 R 中另一个数据框的索引创建新数据框

Creating a new dataframe based on index of another dataframe in R

假设数据:

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

如有任何帮助,我们将不胜感激。

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

这个很明确,它应该计算 m-n 而不是 n-m

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