重新构建置信区间的输出以将平均值、上限值和下限值组合到一个单元格中

问题描述 投票:0回答:1

我使用下面的代码一次计算多个变量的均值、上限和下限置信区间。

library(gmodels)
library(purrr)
dfci <- df %>% 
  group_by(group) %>% 
  dplyr::summarize(across(everything(),
  .fns = list(mean = ~ mean(.x, na.rm = TRUE, trim = 4),
  ci = ~ ci(.x, confidence = 0.95, alpha = 0.05, na.rm = T))))
#dfci <- dfci[-(13:16),] # remove additional rows
write.csv(dfci, file="dfci.csv")

样本数据:

Group| A_pre  |    A_post |  B_pre |  B_post 

0       20          21        20        23
1       30          10        19        11
2       10          53        30        34
1       22          32        25        20
2       34          40        32        30
0       30          50        NA        40
0       39          40        19        20
1       40          NA        20        20
2       50          10        20        10
0       34          23        30        10

因为我有超过 50 个“前”和“后”变量,即 >100 个变量,是否可以将三个所需单元格(平均值、较低和较高 ci)的输出组合成一个,所以我不会手动组合所有他们?

我尝试在 ci 计算后转向 long 但不起作用:


library(reshape2)

dfci <- df %>%
  group_by(group) %>%
  summarize(across(everything(),
                   .fns = list(mean = ~ mean(.x, na.rm = TRUE, trim = 4),
                               ci = ~ ci(.x, confidence = 0.95, alpha = 0.05, na.rm = TRUE))))

dfci <- melt(dfci, id.vars = "group")
dfci <- dcast(dfci, group + variable ~ variable)

write.csv(dfci, file = "dfi.csv", row.names = FALSE)
r pivot reshape2 confidence-interval
1个回答
0
投票

你想要这个吗?

library(tidyverse)

dfci <- df %>%  
  reframe(across(everything(), .fns = list(
    mean = ~ mean(.x, na.rm = TRUE, trim = 4),
    ci = ~ {
      se <- sqrt(var(.x, na.rm = TRUE) / sum(!is.na(.x)))
      mean_val <- mean(.x, na.rm = TRUE)
      lower <- mean_val - qt(0.975, df = sum(!is.na(.x))) * se
      upper <- mean_val + qt(0.975, df = sum(!is.na(.x))) * se
      c(lower, upper)
    }
  )), .by = Group) %>% 
  pivot_longer(cols = -Group, names_to = "variable", values_to = "value") %>%
  mutate(value = case_when(
    str_detect(variable, "mean") ~ paste0("Mean: ", round(value, 2)),
    str_detect(variable, "ci") ~ paste0("CI: [", round(value[1], 2), ", ", round(value[2], 2), "]")
  )) %>%
  select(-variable) %>%
  pivot_wider(names_from = Group, values_from = value, names_prefix = "Group ") %>% 
  unnest()

write.csv(dfci, file = "dfci.csv", row.names = FALSE)

输出.csv:

"Group 0","Group 1","Group 2"
"Mean: 32","Mean: 30","Mean: 34"
"CI: [32, 19.56]","CI: [32, 19.56]","CI: [32, 19.56]"
"Mean: 31.5","Mean: 21","Mean: 40"
"CI: [32, 19.56]","CI: [32, 19.56]","CI: [32, 19.56]"
"Mean: 20","Mean: 20","Mean: 30"
"CI: [32, 19.56]","CI: [32, 19.56]","CI: [32, 19.56]"
"Mean: 21.5","Mean: 20","Mean: 30"
"CI: [32, 19.56]","CI: [32, 19.56]","CI: [32, 19.56]"
"Mean: 32","Mean: 30","Mean: 34"
"CI: [32, 19.56]","CI: [32, 19.56]","CI: [32, 19.56]"
"Mean: 31.5","Mean: 21","Mean: 40"
"CI: [32, 19.56]","CI: [32, 19.56]","CI: [32, 19.56]"
"Mean: 20","Mean: 20","Mean: 30"
"CI: [32, 19.56]","CI: [32, 19.56]","CI: [32, 19.56]"
"Mean: 21.5","Mean: 20","Mean: 30"
"CI: [32, 19.56]","CI: [32, 19.56]","CI: [32, 19.56]"
© www.soinside.com 2019 - 2024. All rights reserved.