【问题标题】:dplyr: using filter, group_by, from within mutate command [duplicate]dplyr:在 mutate 命令中使用过滤器 group_by [重复]
【发布时间】:2014-11-12 11:00:50
【问题描述】:

我想在数据表中添加一列,其中包含 y 的每个值除以 x(1 或 2)中相应条件的平均值,其中 x2 = 1。对于以下 x = 1 的数据,y 应该是除以 1.4,其中 x=2 y 应除以 1。

dt1 <- data.table(x=c("1","1","1","1","1","1","1","1","1","1","2","2","2","2","2","2","2","2","2","2"),
       x2=c("1","1","2","2","2","2","3","3","3","3","1","1","2","2","2","2","3","3","3","3"), 
       y=c(1.41,1.39,1.9,2.1,0.9,1.1,3.1,2.9,3.9,4.1,0.9,1.1,1.9,2.1,0.9,1.1,3.1,2.9,3.9,4.1))

我可以将 x * x2 = 1 的平均值写入一个新文件。

mean <- dt1 %>% filter(x2==1) %>% group_by(x) %>% summarise(mean(y))

但我不知道如何网格化指示命令调用正确的值。 dt1 %>% mutate(z = y/a reference to 'mean')

我想创建一个新列,其中填充了我想要除以的值,但我再次无法弄清楚如何从命令中调用分组条件。

t <- dt1 %>% mutate(T=ifelse(x==1,(filter(x2==1) %>% group_by(x=1) %>%
     summarise(mean(y))),ifelse(x==1,(filter(x2==2) %>% group_by(x=2) %>% 
     summarise(mean(y))),NA)

我并没有只使用 dplyr,但我最近一直在使用它。我愿意接受最简单的解决方案。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    试试

      left_join(dt1,
                dt1 %>% 
                     filter(x2==1) %>%
                     group_by(x) %>%
                     summarise(a=mean(y)), by='x') %>%
                     mutate(z=y/a)%>%
                     head()
    
      #  x x2    y   a         z
      #1 1  1 1.41 1.4 1.0071429
      #2 1  1 1.39 1.4 0.9928571
      #3 1  2 1.90 1.4 1.3571429
      #4 1  2 2.10 1.4 1.5000000
      #5 1  2 0.90 1.4 0.6428571
      #6 1  2 1.10 1.4 0.7857143
    

    或使用data.table

    library(data.table)
    dt2 <- dt1[x2==1,list(a=mean(y)) , by=x]
    setkey(dt1, x)
    res <- dt1[dt2][,z:=y/a]
    head(res)
    #   x x2    y   a         z
    #1: 1  1 1.41 1.4 1.0071429
    #2: 1  1 1.39 1.4 0.9928571
    #3: 1  2 1.90 1.4 1.3571429
    #4: 1  2 2.10 1.4 1.5000000
    #5: 1  2 0.90 1.4 0.6428571
    #6: 1  2 1.10 1.4 0.7857143
    

    更新

    @aosmith 建议的dplyr 更紧凑的选项是

      dt1 %>%
          group_by(x) %>% 
          mutate(a=mean(y[x2==1]), z=y/a)
    

    【讨论】:

    • 这就是诀窍,我不认为它会像这样继续将价值记录在整个组中。这对我帮助很大,谢谢。
    • @Michael Algie 没问题。
    • dplyr 的另一个选项可以是 dt1 %&gt;% group_by(x) %&gt;% mutate(a = mean(y[x2 == 1]), z = y/a),尽管结果仍将分组。
    • @aosmith 感谢 cmets 和紧凑的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多