【问题标题】:How to divide between groups of rows using dplyr with multiple columns?如何使用具有多列的 dplyr 在行组之间进行划分?
【发布时间】:2019-10-16 10:27:45
【问题描述】:

我的问题是this question 的扩展。我想弄清楚如何使用具有多列的 dplyr 来划分行组,而不是单个变量。

我有这个数据框:

x <- data.frame(
    name = rep(letters[1:4], each = 2),
    condition = rep(c("A", "B"), times = 4),
    value1 = c(2,10,4,20,8,40,20,100),
    value2 = c(2,10,4,20,8,40,20,100)
) 
#   name condition value1 value2
# 1    a         A     2       2
# 2    a         B    10       10
# 3    b         A     4       4
# 4    b         B    20       20
# 5    c         A     8       8
# 6    c         B    40       40
# 7    d         A    20       20
# 8    d         B   100       100

我想按名称分组并将condition == "B" 行的值与condition == "A" 行的值相除,得到这个:

data.frame(
    name = letters[1:4],
    value1 = c(5,5,5,5),
    value2 = c(5,5,5,5)
)
#   name value1 value2
# 1    a     5       5
# 2    b     5       5
# 3    c     5       5
# 4    d     5       5

对于带有单个变量的原始问题,Steven Beaupré 给出了最受好评的答案:

x %>% 
group_by(name) %>%
summarise(value = value[condition == "B"] / value[condition == "A"])

但这个答案是针对单值情况的,我不知道如何扩展到“summarise_at”和“summarise_all”。我尝试使用“点”,但无法找出正确的语法。

【问题讨论】:

  • summarise(value1 = value1[condition == "B"] / value1[condition == "A"], value2 = value2[condition == "B"] / value2[condition == "A"])

标签: r dplyr


【解决方案1】:

我想出了一个办法。

x %>% gather(variable, value, -(name:condition)) %>%
group_by(variable,name) %>%
summarise(value = value[condition == "B"] / value[condition == "A"]) %>%
spread(variable,value)

#  name  value1 value2
#   <fct>  <dbl>  <dbl>
# 1 a          5      5
# 2 b          5      5
# 3 c          5      5
# 4 d          5      5

【讨论】:

    【解决方案2】:

    我不确定是否有办法自动将此函数扩展到每个变量。我认为您需要为每个值情况指定汇总函数。

    x %>%
      group_by(name) %>%
      summarise(value1 = value1[condition == "B"] / value1[condition == "A"],
                value2 = value2[condition == "B"] / value2[condition == "A"])
    
    #  name  value1 value2
    #   <fct>  <dbl>  <dbl>
    # 1 a          5      5
    # 2 b          5      5
    # 3 c          5      5
    # 4 d          5      5
    

    【讨论】:

      猜你喜欢
      • 2016-09-23
      • 2020-07-20
      • 2018-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多