Dplyr用于计算多个变量的平均值、SD和图形
我有一张有列的桌子 [时间,var1,var2,var3,var4…varN] 我需要计算每个var1,var2…varn的平均值/SE,我希望以编程方式为所有变量计算平均值/SE,而不是一次1,这将涉及大量的复制粘贴 此处第8.2.3节接近我想要的内容,但我的代码如下:Dplyr用于计算多个变量的平均值、SD和图形,r,dplyr,R,Dplyr,我有一张有列的桌子 [时间,var1,var2,var3,var4…varN] 我需要计算每个var1,var2…varn的平均值/SE,我希望以编程方式为所有变量计算平均值/SE,而不是一次1,这将涉及大量的复制粘贴 此处第8.2.3节接近我想要的内容,但我的代码如下: x <- as.data.frame(matrix(nrow = 2, ncol = 3)) x[1,1] = 1 x[1,2] = 2 x[1,3] = 3 x[2,1] =4 x[2,2] = 5 x[2,3] =
x <- as.data.frame(matrix(nrow = 2, ncol = 3))
x[1,1] = 1
x[1,2] = 2
x[1,3] = 3
x[2,1] =4
x[2,2] = 5
x[2,3] = 6
names(x)[1] <- "time"
names(x)[2] <- "var1"
names(x)[3] <- "var2"
grouped_mean3 <- function(.data, ...) {
print(.data)
summary_vars <- enquos(...)
print(summary_vars)
summary_vars <- purrr::map(summary_vars, function(var) {
expr(mean(!!var, na.rm = TRUE))
})
print(summary_vars)
.data %>%
group_by(time)
summarise(!!!summary_vars) # Unquote-splice the list
}
grouped_mean3(x, var("var1"), var("var2"))
最初的原因是“必须按.data
中找到的变量进行分组”,它找到了一列,该列不在为测试目的而生成的虚拟“x”中。很遗憾,我不知道发生了什么
如何从新的汇总变量中提取平均值并将其添加到.data表中?summary_vars变得像
[[1]]
mean(~var1, na.rm = TRUE)
[[2]]
mean(~var2, na.rm = TRUE)
这似乎很接近,但需要评估。我该如何评价这个!!!没有用
值得一提的是,我尝试将dplyr中的示例插入到这个R引擎中,但也没有成功
帮忙
最终目标将是一张沿着
[时间,var1mean,var2mean,var3mean,var4mean…][/p>试试这个:
library(dplyr)
grouped_mean3 <- function(.data, ...) {
vars <- c(...)
.data %>%
group_by(time) %>%
summarise(across(all_of(vars), mean))
}
grouped_mean3(x, 'var1')
# time var1mean
# <dbl> <dbl>
#1 1 2
#2 4 5
grouped_mean3(x, 'var1', 'var2')
# time var1mean var2mean
# <dbl> <dbl> <dbl>
#1 1 2 3
#2 4 5 6
库(dplyr)
分组平均为3%
总结(全部变量、平均值)
}
分组平均值3(x,'var1')
#时间变量平均值
#
#1 1 2
#2 4 5
分组平均值3(x,‘var1’、‘var2’)
#时间变量1平均值变量2平均值
#
#1 1 2 3
#2 4 5 6
试试这个:
library(dplyr)
grouped_mean3 <- function(.data, ...) {
vars <- c(...)
.data %>%
group_by(time) %>%
summarise(across(all_of(vars), mean))
}
grouped_mean3(x, 'var1')
# time var1mean
# <dbl> <dbl>
#1 1 2
#2 4 5
grouped_mean3(x, 'var1', 'var2')
# time var1mean var2mean
# <dbl> <dbl> <dbl>
#1 1 2 3
#2 4 5 6
库(dplyr)
分组平均为3%
总结(全部变量、平均值)
}
分组平均值3(x,'var1')
#时间变量平均值
#
#1 1 2
#2 4 5
分组平均值3(x,‘var1’、‘var2’)
#时间变量1平均值变量2平均值
#
#1 1 2 3
#2 4 5 6
也许这就是你要找的
x %>%
group_by(time) %>%
summarise_at(vars(starts_with('var')), ~mean(.,na.rm=T)) %>%
rename_at(vars(starts_with('var')),funs(paste(.,"mean"))) %>%
merge(x)
根据您的数据(来自您的问题),以下是输出:
time var1mean var2mean var1 var2
1 1 2 3 2 3
2 4 5 6 5 6
也许这就是你要找的
x %>%
group_by(time) %>%
summarise_at(vars(starts_with('var')), ~mean(.,na.rm=T)) %>%
rename_at(vars(starts_with('var')),funs(paste(.,"mean"))) %>%
merge(x)
根据您的数据(来自您的问题),以下是输出:
time var1mean var2mean var1 var2
1 1 2 3 2 3
2 4 5 6 5 6
您的代码将给出不同的错误,
object'summary\u vars'未找到
。请确保您的代码实际上是可复制的。添加summary\u vars Smthg,如library(dplyr)data%%>%group\u by(Time)%%>%summary(cross(var1:varN,mean))
@AbdessabourMtk我添加了这一点,但仍然可以看到“Error in!summary\u vars:invalid argument type.”示例已更新,尽管如此。@Axeman我更新了页面,让您可以复制粘贴代码,包括生成一个伪数据表以引发错误。您的代码将给出另一个错误,object'summary\u vars'未找到
。请确保您的代码实际上是可复制的。添加summary\u vars Smthg,如library(dplyr)data%%>%group\u by(Time)%%>%summary(cross(var1:varN,mean))
@AbdessabourMtk我添加了这一点,但仍然可以看到“Error in!summary\u vars:invalid argument type.”示例已更新,尽管如此。@Axeman我更新了页面,让您可以复制粘贴代码,包括生成一个虚拟数据表以引发错误。谢谢-这让我接近了,但不幸的是,我仍然无法理解一些东西-该代码并没有给我一个有意义的表,当我运行它时,它给了我“x”。x%>%group_by(time)%>%SUMMARY(mean_value=mean(var1))上述短语将为我找到var1 by time的“平均值”。我基本上是想弄清楚如何使“var1”成为一个可以传入的变量(例如,作为字符串),然后这样我就可以在mean_var1、mean_var2、mean_var3的原始数据框“x”中添加列…@RNewbie你把输出存储在新变量中了吗?像这样x1 FWIW这并没有解决我最初的问题,但这句话:“x%>%group\u by(time)%>%summary\u at(vars(names(x)[-1]),funs(mean(,na.rm=TRUE))”似乎让我得到了我想要的一切手段。所以这是一个开始。@RNewbie我的答案提供的输出与您的最终目标类似。我已经更新了答案来说明这一点。如果这不是你想要的,你需要用准确的预期输出和更好的数据更新你的帖子。我在你的帖子中没有看到任何其他“原始问题”。谢谢-这让我接近了,但不幸的是,我仍然无法理解一些东西-代码没有给我一个包含方法的表,当我运行它时,它给了我“x”。x%>%group_by(time)%>%SUMMARY(mean_value=mean(var1))上述短语将为我找到var1 by time的“平均值”。我基本上是想弄清楚如何使“var1”成为一个可以传入的变量(例如,作为字符串),然后这样我就可以在mean_var1、mean_var2、mean_var3的原始数据框“x”中添加列…@RNewbie你把输出存储在新变量中了吗?像这样x1 FWIW这并没有解决我最初的问题,但这句话:“x%>%group\u by(time)%>%summary\u at(vars(names(x)[-1]),funs(mean(,na.rm=TRUE))”似乎让我得到了我想要的一切手段。所以这是一个开始。@RNewbie我的答案提供的输出与您的最终目标类似。我已经更新了答案来说明这一点。如果这不是你想要的,你需要用准确的预期输出和更好的数据更新你的帖子。我在你的帖子中没有看到任何其他“原始问题”。