【问题标题】:dplyr broadcasting single value per group in mutatedplyr 在 mutate 中广播每个组的单个值
【发布时间】:2016-03-08 15:29:12
【问题描述】:

我正在尝试做一些与Scale relative to a value in each group (via dplyr) 非常相似的事情(但是这个解决方案似乎让 R 崩溃了)。我想为每个组复制一个值并添加一个重复该值的新列。作为一个例子,我有

library(dplyr)

data = expand.grid(
  category = LETTERS[1:2],
  year = 2000:2003)
data$value = runif(nrow(data))

data

  category year     value
1        A 2000 0.6278798
2        B 2000 0.6112281
3        A 2001 0.2170495
4        B 2001 0.6454874
5        A 2002 0.9234604
6        B 2002 0.9311204
7        A 2003 0.5387899
8        B 2003 0.5573527

我想要一个类似的数据框

data

  category year     value    value2
1        A 2000 0.6278798 0.6278798
2        B 2000 0.6112281 0.6112281
3        A 2001 0.2170495 0.6278798
4        B 2001 0.6454874 0.6112281
5        A 2002 0.9234604 0.6278798
6        B 2002 0.9311204 0.6112281
7        A 2003 0.5387899 0.6278798
8        B 2003 0.5573527 0.6112281

即每个类别的值是 2000 年的值。我试图想出一个可扩展到给定过滤标准的通用解决方案,即类似

data %>% group_by(category) %>% mutate(value = filter(data, year==2002))

但是由于分配的长度不正确,这不起作用。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这样做:

    data %>% group_by(category) %>%
      mutate(value2 = value[year == 2000])
    

    你也可以这样做:

    data %>% group_by(category) %>%
      arrange(year) %>%
      mutate(value2 = value[1])
    

    data %>% group_by(category) %>%
      arrange(year) %>%
      mutate(value2 = first(value))
    

    data %>% group_by(category) %>%
      mutate(value2 = nth(value, n = 1, order_by = "year"))
    

    或者可能还有其他几种方式。

    由于某些原因,您对mutate(value = filter(data, year==2002)) 的尝试没有意义。

    1. 当您再次显式传入 data 时,它不是之前分组的链的一部分,因此它不知道分组。

    2. 所有dplyr 动词都将数据框作为第一个参数并返回一个数据框,包括filter。当您执行value = filter(...) 时,您正在尝试将完整的数据框分配给value 的单列。

    【讨论】:

    • 啊,好吧,是的,我知道再次将数据传递给 filter() 有问题,但想不出其他方法。在您的第一个示例中,我是否正确地假设数据 [data$year==2002,] 形式的某些事情正在发生,然后由于这是在一个组的上下文中,它知道如何广播这些值?跨度>
    • 当事物被分组时,可以把它想象成每个组都有一个单独的数据框,所以它以sub_df = data[data$category == "A"] 开头。从那里,dplyr 知道列名,所以value[year == 2000] 它知道在sub_df 内部查找year == 2000,这将返回一个布尔向量,当年份为 2000 时为 TRUE。它子集value,这是value的对应向量,基于我们用year == 2000创建的布尔向量。
    • 数据表更明确地做到了这一点,指的是.SD的子数据帧(代表sub data表) .
    猜你喜欢
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 2014-03-05
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多