【问题标题】:How to subtract values by group (subtract blank stored as one group) using dplyr?如何使用 dplyr 按组减去值(减去存储为一组的空白)?
【发布时间】:2019-11-27 08:17:11
【问题描述】:

我有一些整理的数据,其中一组是空白的:

df <- data.frame(Group = c(rep(LETTERS[1:3], 3), "Blank", "Blank", "Blank"), 
                 ID = rep(1:3, 4),
                 Value = c(10, 11, 12, 21, 22, 23, 31, 32, 33, 1, 2, 3))    
df
   Group ID Value
1      A  1    10
2      B  2    11
3      C  3    12
4      A  1    21
5      B  2    22
6      C  3    23
7      A  1    31
8      B  2    32
9      C  3    33
10 Blank  1     1
11 Blank  2     2
12 Blank  3     3

我想从每组(A、B、C)中减去Blank,所以标准化数据将如下所示:

df_normalized<- data.frame(Group = rep(LETTERS[1:3], 3),
             ID = rep(1:3, 3),
             Value = c(9, 9, 9, 20, 20, 20, 30, 30, 30))

df_normalized
  Group ID Value
1     A  1     9
2     B  2     9
3     C  3     9
4     A  1    20
5     B  2    20
6     C  3    20
7     A  1    30
8     B  2    30
9     C  3    30

如何使用 dplyr 很好地做到这一点?

编辑: 如何为多个组做到这一点?例如:

df <- data.frame(Cluster = c(rep("C1", 12), rep("C2", 12)),
                 Group = rep(c(rep(LETTERS[1:3], 3), "Blank", "Blank", "Blank"), 2), 
                 ID = rep(1:3, 8),
                 Value = sample(24))

【问题讨论】:

    标签: r transform tidyverse dplyr


    【解决方案1】:

    假设您在每个 ID 中只有一个“空白”值,如示例所示,您可以这样做

    library(dplyr)
    
    df %>%
      group_by(ID) %>%
      mutate(Value = Value - Value[Group == "Blank"])  %>%
      filter(Group != "Blank")
    
    #  Group    ID Value
    #  <fct> <int> <dbl>
    #1 A         1     9
    #2 B         2     9
    #3 C         3     9
    #4 A         1    20
    #5 B         2    20
    #6 C         3    20
    #7 A         1    30
    #8 B         2    30
    #9 C         3    30
    

    如果您有多个“空白”,您可以使用match,这将确保只选择第一个值。

    df %>%
      group_by(ID) %>%
      mutate(Value = Value - Value[match("Blank", Group)])  %>%
      filter(Group != "Blank")
    

    【讨论】:

    • 谢谢!这几乎解决了问题:) 但是如何为多个组执行此操作(请参阅原始问题的编辑)?
    • @Art 不确定我是否遗漏了什么,但那不只是在group_by 中添加Cluster 吗? df %&gt;% group_by(ID, Cluster) %&gt;%.... 或者你期待别的输出吗?
    • 哦,没错,当然!我在我的真实数据中尝试过,但由于某些完全其他的原因没有奏效。但是在这个例子上工作正常!再次感谢您的帮助!
    猜你喜欢
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 2012-02-25
    • 2020-08-12
    • 2023-04-02
    • 1970-01-01
    • 2012-03-09
    相关资源
    最近更新 更多