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
或可能的来具有替代值,如果存在此类例外情况