循环并将相同的dplyr函数应用于多个列

循环并将相同的dplyr函数应用于多个列,r,dplyr,R,Dplyr,假设在R中有这样一个数据帧: df <- data.frame(factor1 = c("A","B","B","C"), factor2 = c("M","F","F","F"), factor3 = c("0", "1","1","0"), value = c(23,32,4,1)) 现在我想对所有因子列都这样做(想想100个因子变量)。在dplyr中有这样做的方法吗?我也在考虑对名称(d

假设在R中有这样一个数据帧:

df <- data.frame(factor1 = c("A","B","B","C"),
                factor2 = c("M","F","F","F"),
                factor3 = c("0", "1","1","0"),
                value = c(23,32,4,1))

现在我想对所有因子列都这样做(想想100个因子变量)。在dplyr中有这样做的方法吗?我也在考虑对
名称(df)
进行
循环,但我将变量作为字符串获取,
groupby()
不接受字符串。

只需将数据放在长格式中即可

library(tidyr)
df %>% gather(key = factor, value = level, -value) %>%
    group_by(factor, level) %>%
    summarize(mean = mean(value))

#    factor level     mean
#     (chr) (chr)    (dbl)
# 1 factor1     A 23.00000
# 2 factor1     B 18.00000
# 3 factor1     C  1.00000
# 4 factor2     F 12.33333
# 5 factor2     M 23.00000
# 6 factor3     0 12.00000
# 7 factor3     1 18.00000

要真正构建一个循环,vignette是正确的起点。

非常感谢!您知道您是否可以在for循环中迭代列名来实现这一点吗?有一个数据帧列表可能很有用,每个因素对应一个。为什么要循环?如果您想在末尾列出数据帧列表,请使用上面的结果并拆分(result,result$factor)
。它在其他情况下可能会很有用。我想我更想知道如何在dplyr中使用列名而不命名它们。例如:
df%>%filter(names(df)[1]==“A”)
不起作用,但可能类似的东西会起作用?@Gregor我不清楚你为什么推荐混合评估小插曲。也许你是说那个?那确实是我的意思。
library(tidyr)
df %>% gather(key = factor, value = level, -value) %>%
    group_by(factor, level) %>%
    summarize(mean = mean(value))

#    factor level     mean
#     (chr) (chr)    (dbl)
# 1 factor1     A 23.00000
# 2 factor1     B 18.00000
# 3 factor1     C  1.00000
# 4 factor2     F 12.33333
# 5 factor2     M 23.00000
# 6 factor3     0 12.00000
# 7 factor3     1 18.00000