【发布时间】:2020-12-07 02:03:02
【问题描述】:
我有一个数据框,我想在其中计算一些额外列作为现有列的函数,但想动态指定每个新列名和函数。我有一个列名向量已经在数据框df_daily:
DAILY_QUESTIONS <- c("Q1_Daily", "Q2_Daily", "Q3_Daily", "Q4_Daily", "Q5_Daily")
数据框的行包含每个用户每次回答问卷时对每个问题的回答,以及一列包含自用户首次回答问卷以来的天数(即第一次使用时 Days_From_First_Use = 0 , = 1 如果第二天使用等)。我想按 Days_From_First_Use 对这些问题的回答进行平均。我首先将我的数据框按 Days_From_First_Use 分组:
df_test <- df_daily %>%
group_by(Days_From_First_Use)
然后尝试对循环中的响应进行平均,如下所示:
for(i in 1:5){
df_test <- df_test %>%
mutate(!! paste0('Avg_Score_', DAILY_QUESTIONS[i]) :=
paste0('mean(', DAILY_QUESTIONS[i], ')'))
}
不幸的是,虽然我的新变量名称是正确的 ("Avg_Score_Q1_Daily", "Avg_Score_Q2_Daily", "Avg_Score_Q3_Daily", "Avg_Score_Q4_Daily", "Avg_Score_Q5_Daily"),但我的答案却不是:我的数据框中的每一行在相关列中都有一个字符串,例如 "mean(Q1_Daily)"。
所以我显然做错了什么 - 我需要做些什么来解决这个问题并获得每天所有用户的平均分数?
在此致以诚挚的谢意
托马斯·飞利浦
【问题讨论】:
-
您是否看过 Tom Roth 对类似名称的常见问题解答 How to use dynamic variable names in dplyr? 它显示了在
:=两侧使用变量的示例。 -
我做到了,但没有完全理解。我会回去再次查看它,看看它是否能解决我的问题。
-
其实,再看更多,我认为更当前的方法是使用
{{,如Ronak's answer。也可以在Programming with dplyr vignette中看到“如果要在输出中使用变量名,可以使用胶合语法结合:=”这句话下的例子Programming with dplyr vignette -
不走运:我创建了一个函数
my_mutate_mean <- function(df, question) { df %>% mutate( "Avg_score_{{question}}" := mean({{ question }}) ) }' and then call it in a loop 'for(i in 1:5){ df_test <- my_mutate_mean(df_test, DAILY_QUESTIONS[i]) },但我只在名为 Avg_Score_DAILY_QUESTIONS[i] 的变量中得到一列 NAs -
您能否分享足够的数据以使您的示例可重现以便我们进行测试?