Dplyr用于计算多个变量的平均值、SD和图形

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] =

我有一张有列的桌子

[时间,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] = 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我的答案提供的输出与您的最终目标类似。我已经更新了答案来说明这一点。如果这不是你想要的,你需要用准确的预期输出和更好的数据更新你的帖子。我在你的帖子中没有看到任何其他“原始问题”。