【问题标题】:Creating a new dataframe based on index of another dataframe in R基于R中另一个数据框的索引创建一个新的数据框
【发布时间】:2016-05-07 09:51:47
【问题描述】:

假设数据:

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

任何帮助将不胜感激。

【问题讨论】:

    标签: r indexing dataframe computation


    【解决方案1】:

    这一项明确表示它应该计算 m-n 而不是 n-m

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

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-18
        • 2019-02-02
        • 1970-01-01
        • 1970-01-01
        • 2018-05-20
        • 2020-10-11
        • 2017-08-15
        • 1970-01-01
        相关资源
        最近更新 更多