【问题标题】:dplyr calculating new column based on filtering, group, and summarisedplyr 基于过滤、分组和汇总计算新列
【发布时间】:2023-03-14 02:34:01
【问题描述】:

鉴于下面的foo,我正在尝试根据y 值子集的平均值计算三组id 的异常y。在 dplyr 语法方面我看不到前进的方向,但必须有一个简单的方法。

也就是说,我想要一种方法来计算一个新列yAnom,即y-mean(y),当x<=5为每个id时,y的值。基础 R 解决方案:

foo <- tibble(x = rep(1:10,3), y = rnorm(30), id = rep(letters[1:3],each=10))
# subtract y from mean of y for values of y when x <= 5 by group
#E.g., 
y5Means <- foo %>% group_by(id) %>% filter(x <= 5) %>% summarise(avg = mean(y)) %>% pull(avg)
foo$yAnom <- c(foo$y[foo$id == "a"] - y5Means[1],
               foo$y[foo$id == "b"] - y5Means[2],
               foo$y[foo$id == "c"] - y5Means[3])

帮助表示赞赏。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    可能类似于以下内容:

    foo %>%
      # new column with only the values you want to average over, and NA elsewhere
      mutate(y_when_x_under_5 = ifelse(x <= 5, y, NA)) %>%
      # new column with mean for each group
      group_by(id) %>%
      mutate(y_mean = mean(y_when_x_under_5, na.rm = TRUE)) %>%
      # required calculation
      mutate(yAnom = y - y_mean)
    

    【讨论】:

    • 啊!谢谢。获得正确长度的ifelse 是我进行逻辑跳转所需要的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    相关资源
    最近更新 更多