首页 > 解决方案 > 如何根据分组数据框中另一个变量中的条件从变量中返回值?

问题描述

我正在使用基本group_by()+summarize_at方法计算分组数据框中每个变量的一些指标。每个组代表一个小的时间序列。我想计算的一个指标是day == 1每个组中每个变量的初始值(在本例中为 )。因此,广义问题是在分组数据帧的组内基于另一个变量中的标准返回一个变量的值。在group_by()+summarize_at方法中,我相信我需要一个summarize_at可以应用于每个变量的自定义函数。我可以成功部署仅依赖于手头数据变量的其他自定义函数。我似乎对让函数去查看数据框的其他列很感兴趣。

我不赞成这种方法,并欢迎其他建议。但是,我对 dplyr 最满意。

# a dataset
df <- data.frame(day = rep(c(1:5),3),
                 group = c(rep(1,5),rep(2,5),rep(3,5)),
                 var_a = seq(1:15),
                 var_b = seq(2,30, length.out = 15),
                 var_c = seq(3,45, length.out = 15))

# the logic of what I am going for, on a manually extracted example group:
# initial value (day == 1) of var_a for group 2

df_subset <- df %>% 
  filter(group == 2)
df_subset$var_a[which(df_subset$day == 1)]
# [1] 6

# my laughable attempt at a function

initial <- function(x){
  ini <- which(.$day == 1)
  x[ini]
}

# custom function deployed in dplyr pipe (which of course doesn't work)
df %>% 
  group_by(group) %>% 
  summarize_at(c("var_a","var_b","var_c"), 
               list(max = max, ini = initial)) 

非常感谢。

标签: r

解决方案


在该步骤之后,使用其中一个group_by指定要选择的变量(这里可以正常工作),然后在 中,在每一列上应用不同的函数(这是一种为匿名调用添加前缀而不是显式指定的方法),对于第二个函数,'day' 不是所选列的一部分,但可以用不带引号的列名来选择summarise_atselect_helpersstarts_withlist~function(x)

library(dplyr)
df %>%
  group_by(group) %>%
  summarise_at(vars(starts_with('var')),
         list(max = ~max(.), ini = ~ .[day == 1]))

推荐阅读