【问题标题】:Calculate mean by group among observation without NA在没有 NA 的情况下按组计算平均值
【发布时间】:2021-07-06 04:12:20
【问题描述】:

更新:

嗨!我有这样的数据。

structure(list(V1QB10 = c(1, 1, 1, 2, 1, 3, 3, 1, 4, 2), V1QB12A = c(2, 
1, 2, 3, NA, 2, 2, 3, 2, 2), V1QB12B = c(NA, 2, 2, 2, 2, 1, 2, 
2, 2, 2), V1QB12C = c(NA, 1, 2, 2, 2, 1, 2, 2, 2, 2), sum = c(NA, 
4, 6, 7, NA, 4, 6, 7, 6, 6)), row.names = c(NA, 10L), class = "data.frame")

这是数据的样子:

 V1QB10 V1QB12A V1QB12B V1QB12C sum
1       1       2      NA      NA  NA
2       1       1       2       1   4
3       1       2       2       2   6
4       2       3       2       2   7
5       1      NA       2       2  NA
6       3       2       1       1   4
7       3       2       2       2   6
8       1       3       2       2   7
9       4       2       2       2   6
10      2       2       2       2   6

变量“sum”是“V1QB12*”的总和。 现在我正在尝试通过“V1QB10”计算“总和”的平均值:

dt %>%
  group_by(V1QB10) %>%
  dplyr::summarise(n=n(), mean=mean(sum), sd=sd(sum)) %>%
  as.data.frame()  

我希望计算如下:

对于V1QB10==1,n为3(去掉“V1QB12*”中带有NA的2个观测值),求和“sum”:4+6+7=17,然后计算均值:17/3 , 和 sd。

但我发现我一直在平均 17/5。尝试用n=n(V1QB12A) 替换代码也没有奏效。 可能是我想多了这个问题。我要怎么修呢? 谢谢!

【问题讨论】:

  • 你能给出这个例子的预期输出吗?
  • V1QB10 有一行值为 4,其中 sum 为 6。因此,其平均 sum 也是 6,但对于长度为 1 的向量,sd 未定义。较短的等效项:sd(6) = NA
  • @RonakShah 嗨,我刚刚编辑了问题。
  • 只需在mean 中添加na.rm = TRUE 即可忽略NA 值? mean=mean(sum, na.rm. =TRUE)
  • 这肯定是重复的。

标签: r dplyr


【解决方案1】:

我不完全确定我是否符合您的要求,但 dplyr 包有一个漂亮的 drop_na() 函数,如果您像这样使用它,它将删除 NA:

dt <- dt %>%
  drop_na() %>%
  dplyr::mutate(sum=rowSums(dplyr::select(., contains("V1QB12")), na.rm=T))

dt %>%
  group_by(V1QB10) %>%
  dplyr::summarise(n=n(), mean=mean(sum), sd=sd(sum)) %>%
  as.data.frame()

结果:

 V1QB10 n     mean        sd
1      1 3 5.666667 1.5275252
2      2 2 6.500000 0.7071068
3      3 2 5.000000 1.4142136
4      4 1 6.000000        NA

【讨论】:

  • 谢谢你!这绝对是一个解决方案。但是因为我在数据集中还有其他变量,所以对于 drop_na() 我需要创建一个子集(我知道这并不难)。我正在考虑是否有一种方法可以做到这一点而不会从数据集中永久删除任何观察结果
猜你喜欢
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 2021-12-11
相关资源
最近更新 更多