R 如何根据分组数据帧中另一个变量的条件从变量返回值?

R 如何根据分组数据帧中另一个变量的条件从变量返回值?,r,R,我正在使用基本的group\u by()+summary\u at方法计算分组数据帧中一组变量的一些度量。每个组代表一个小的时间序列。我想计算的一个指标是每组中每个变量的初始值(在本例中,day==1)。因此,广义问题是在分组数据帧的组内,基于另一个变量中的标准返回一个变量的值。在group\u by()+summary\u at方法中,我相信我需要一个自定义函数,该函数可以应用于每个变量。我可以成功地部署其他仅依赖于手头数据变量的自定义函数。我似乎对让函数去查看dataframe的其他列很感兴

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

我不赞成这种做法,并欢迎其他建议。但是,我对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)) 
#数据集

df在
分组步骤后,使用一个
选择帮助程序
(此处
开始)指定要在
列表中选择的变量,并在每个列上应用不同的函数(
~
是为匿名调用添加前缀的一种方法,而不是显式指定
函数(x)
),对于第二个函数,“day”不是所选列的一部分,但可以使用不带引号的列名来选择

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

分组步骤后,使用
选择帮助程序之一指定要在
摘要中选择的变量(此处
开始时使用
效果良好),并在
列表中对每个列应用不同的功能(
~
是为匿名调用添加前缀的一种方法,而不是显式指定
函数(x)
),对于第二个函数,“day”不是所选列的一部分,但可以使用不带引号的列名来选择

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

非常简单。感谢您的时间!在添加到我的代码中后,我了解到这不是一种非常稳健的方法(没有@akrun的正确答案错误)。如果每个组中没有恰好一行符合标准,则会抛出错误。出于我的目的,请使用mean(
ini=~mean([day==1])
)这是一个令人满意的解决方法,尽管它可能不适用于所有类似的应用程序。@fantanaman我会使用
tryCatch
可能
,如果存在如此简单的例外情况,则可以使用另一个值。谢谢您的时间!在添加到我的代码后,我了解到这不是一个非常健壮的方法(@akrun的正确答案没有错误)。如果每组中没有恰好一行符合条件,则会引发错误。出于我的目的,请使用mean(
ini=~mean([day==1])换行。
)是一个令人满意的解决方法,尽管它可能不适用于所有类似的应用程序。@fantanaman I将使用
tryCatch
可能的
来具有替代值,如果存在此类例外情况