【问题标题】:How to use dplyr to calculate difference between a set of rows and a target row?如何使用 dplyr 计算一组行和目标行之间的差异?
【发布时间】:2017-02-21 17:43:30
【问题描述】:

我遇到了数据操作问题。基本上我有一个包含两个因子列和一个响应变量的数据框,如下所示:

set.seed(1234)
df <- data.frame(ID = rep(1:10,each=4),
                 Condition = factor(rep(c("A","B","C","D"),10)),
                     Resp = runif(40,0,1))

我想要完成的是创建一个新列 Resp_new,对于每个 ID,它包括变量 Condition 的级别 A 与其余级别 B 之间的差异 Resp ,CD

我想用 dplyr 解决这个问题,因为它是我处理数据的主要工具,但我们非常感谢任何帮助。

【问题讨论】:

    标签: r dplyr data-manipulation


    【解决方案1】:

    如果数据集按照示例中的顺序排序,这很容易在 base R 中使用ave 完成。

    df$respNew <- ave(df$Resp, df$ID, FUN=function(i) i - i[1])
    

    ave 的第一个参数是要操作的向量,第二个是分组变量。第三个是在操作中使用的函数。这只是第一个元素 (ID == A) 与向量组的所有元素之差。

    前六行返回

     head(df)
      ID Condition      Resp    respNew
    1  1         A 0.1137034  0.0000000
    2  1         B 0.6222994  0.5085960
    3  1         C 0.6092747  0.4955713
    4  1         D 0.6233794  0.5096760
    5  2         A 0.8609154  0.0000000
    6  2         B 0.6403106 -0.2206048
    

    【讨论】:

    • 如果你在这个出色的答案之后仍然想要 dplyr :) 。 df %>% mutate(respNew= ave(Resp, ID, FUN=function(i) i - i[1]))
    • @thisisrg 或者,只需输入一个令牌 dplyr 函数 :) df$respNew &lt;- df$Resp - ave(df$Resp, df$ID, FUN = dplyr::first)
    猜你喜欢
    • 1970-01-01
    • 2021-11-19
    • 2018-05-23
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多