R计算具有相同名称的列的标准差

R calculate standard deviation for the columns with same names

我有一个简单的问题

我有一个包含许多测量列的数据框。我想计算具有相同 (header) 名称的列的平均值。我使用了下面的代码(在 Whosebug 中找到)..

How to calculate the mean of those columns in a data frame with the same column name

作为示例数据...

df <- data.frame(c(1, 2, 3, 4,5),
                 c(2, 3, 4,NA,2),
                 c(3, 4, 5,3,6),
                 c(3, 7, NA,3,6))
names(df) <- c("a", "b", "a", "b")

df <- sapply(split.default(df, names(df)), rowMeans, na.rm = TRUE) 

结果是这样的...

a    b
2    2.5
3    5
4    4
3.5  3
5.5  4

此代码给出了具有相同 (header) 名称的列的平均值。

但我也想要标准偏差。我尝试用 rowSds 替换 rowMeans,但它没有用。

知道如何使用相同的代码计算标准差和平均值吗?

这应该有效:

df <- data.frame(c(1, 2, 3),
                 c(2, 3, 4),
                 c(3, 4, 5))
names(df) <- c("a", "b", "a")


sapply(split.default(df, names(df)), function(smaller_df) {
  sapply(smaller_df, function(col) c(mean(col), sd(col)))
})

第一个 sapply 作用于 split 产生的每个 data.frame,每个都对应一组具有相同名称的列。第二个 sapply 适用于每一列。

如果您想获得具有给定名称的列中所有测量值的平均值和标准差,而不是作为单独的样本,您可以将内部应用更改为:

sapply(list(unlist(smaller_df)), function(col) c(mean(col), sd(col)))

这是一个可能有用的用户定义函数。你可能想看看:

rowVars

基于您之前的方法的一个想法是执行以下操作

sapply(split.default(df, names(df)), function(x) apply(x, 1, sd, na.rm=TRUE))
#              a         b
# [1,] 1.4142136 0.7071068
# [2,] 1.4142136 2.8284271
# [3,] 1.4142136        NA
# [4,] 0.7071068        NA
# [5,] 0.7071068 2.8284271

请记住,返回 NAs 是因为 sd 不应在大小为 1 的样本上进行评估。