【问题标题】:calculating mean for two columns of response variables at once一次计算两列响应变量的平均值
【发布时间】:2020-02-06 01:31:23
【问题描述】:

我正在尝试分析一个数据集,其中有两个响应变量 X 和 Y 以及两个分组变量 Treatment 和 Rep:

tribble(
    ~Treatment, ~Rep, ~X,   ~Y
    , "N1", 1, 10.18, 14.38
    , "N1", 2, 13.53, 14.38
    , "N2", 1, 15.34, 18.28
    , "N2", 2, 10.4,  7.14
    , "N3", 1, 8.57,  22.57
    , "N3", 2, 13.95, 19.9
    , "N4", 1, 16.69, NA
    , "N4", 2, 14.33, 9.32
    , "N5", 1, NA,    NA
    , "N5", 2, 15.74, 15.39
)

我想计算每个响应变量的每个处理的平均值、sd 和 se 值。然后我想在 x 轴上制作一个带有治疗的线图; X 和 Y 各有两条线,带有置信区间误差线。

我使用 summarise_at 来计算:

df<-Data1 %>%
  group_by(Treatment, Rep) %>% 
  summarise_at(vars(-group_cols()), list(mean = ~mean(X, Y, na.rm = TRUE), 
                                         sd = ~sd(X, Y, na.rm = TRUE),
                                         se= ~sd(X, Y, na.rm = TRUE)/sqrt(n()))) %>% 
  summarise_at(vars(mean:se), mean, na.rm = TRUE)

但我收到此错误:

Error in if (trim > 0 && n) { : missing value where TRUE/FALSE needed

我不确定能否以这种方式为 summarise_at 放置两个变量。感谢您的帮助!

【问题讨论】:

  • sd() 接受一个论点 - sd(X,Y) 应该做什么?
  • 我想计算 X 和 Y 的均值、sd 和 se。即使我只输入一个参数也会出错。
  • 试试这个作为第一步Data1 %&gt;% group_by(Treatment, Rep) %&gt;% summarise_at(vars(X, Y), list(mean = ~mean(.x, na.rm = TRUE), sd = ~sd(.x, na.rm = TRUE), se= ~sd(.x, na.rm = TRUE)/sqrt(n())))。这些函数只需要一个参数,.x 将首先获取 X 值,然后是 Y 值,因为您关注的是这两列。
  • ...另外,您的示例数据集并没有多大帮助,因为每个 TreatmentRep 对都有一个值。 :) 为 2-3 个唯一对提供一些值会更好,所以 meansd 可能更有意义。

标签: r


【解决方案1】:
se <- function(x, na.rm = TRUE) sd(x, na.rm = na.rm)/sqrt(length(x))

df %>%
    group_by(Treatment, Rep) %>%
    summarise_at(vars(X,Y)
                 , list(sd = sd
                        , mean = mean
                        , se = se)
                 , na.rm = TRUE)

   Treatment   Rep  X_sd  Y_sd X_mean Y_mean  X_se  Y_se
   <chr>     <dbl> <dbl> <dbl>  <dbl>  <dbl> <dbl> <dbl>
 1 N1            1    NA    NA  10.2   14.4     NA    NA
 2 N1            2    NA    NA  13.5   14.4     NA    NA
 3 N2            1    NA    NA  15.3   18.3     NA    NA
 4 N2            2    NA    NA  10.4    7.14    NA    NA
 5 N3            1    NA    NA   8.57  22.6     NA    NA
 6 N3            2    NA    NA  14.0   19.9     NA    NA
 7 N4            1    NA    NA  16.7  NaN       NA    NA
 8 N4            2    NA    NA  14.3    9.32    NA    NA
 9 N5            1    NA    NA NaN    NaN       NA    NA
10 N5            2    NA    NA  15.7   15.4     NA    NA

【讨论】:

  • 谢谢,但是,它没有给出平均值和其他值。
  • 是的,它给出了平均值。使用输出查看编辑后的答案。它不提供标准偏差,因为组只有 2 个值,但如果您有更大的组,那应该没问题。
  • 两次重复以上的每次治疗并没有给出平均值。例如N1 的 X_mean 为 11.85。
  • 您上面的代码没有说“超过两次代表”,而是说group_by(Treatment, Rep)
  • 因此,如果您在我的回答中从group_by() 中删除Rep,您会得到该结果。我可以在答案中改变它,但是你需要在问题中改变它。
【解决方案2】:

1.创建可重现的最小示例数据集

df <- data.frame(Treatment = paste0("N", rep(1:5, each=2)),
                 Rep = c(1,2),
                 X = runif(10),
                 Y = runif(10))

2.使用tidyverse的解决方案:

library(tidyverse)

df %>% 
  group_by(Treatment) %>% 
  summarise(N = n(),
            X_sd = sd(X, na.rm=FALSE),
            Y_sd = sd(Y, na.rm=FALSE),
            X_mean = mean(X, na.rm=FALSE),
            Y_mean = mean(Y, na.rm=FALSE),
            X_se = X_sd/sqrt(N),
            Y_se = Y_sd/sqrt(N)) %>%
  ungroup() %>% 
  pivot_longer(cols=c(X_mean, Y_mean),
               names_to = "mean") %>% 
  ggplot(aes(Treatment, value, color = mean, group=mean)) +
    geom_line()

编辑:

result_df <- df %>% 
  group_by(Treatment) %>% 
  summarise(N = n(),
            X_sd = sd(X, na.rm=FALSE),
            Y_sd = sd(Y, na.rm=FALSE),
            X_mean = mean(X, na.rm=FALSE),
            Y_mean = mean(Y, na.rm=FALSE),
            X_se = X_sd/sqrt(N),
            Y_se = Y_sd/sqrt(N)) %>%
  ungroup() %>% 
  pivot_longer(cols=c(X_mean, Y_mean),
               names_to = "mean")

result_df

result_plot <- result_df %>%
ggplot(aes(Treatment, value, color = mean, group=mean)) +
    geom_line()

【讨论】:

  • 谢谢,如何查看表格中的mean、sd和se值?你能告诉它是如何工作的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-23
  • 2021-05-18
  • 2020-04-03
  • 1970-01-01
  • 2021-06-14
相关资源
最近更新 更多