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

时间:2018-01-16 15:29:22

标签: r sapply standard-deviation

我有一个简单的问题

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

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

此代码给出了具有相同(标题)名称的列的含义。

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

任何想法如何使用相同的代码来计算标准差以及平均值?

3 个答案:

答案 0 :(得分:3)

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

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的样本进行评估。

答案 1 :(得分:1)

这应该有效:

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,每个data对应一组具有相同名称的列。第二个sapply适用于每一列。

如果要获得具有给定名称的列中所有度量的平均值和标准差,而不是单独的样本,则可以将内部sapply更改为:

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

答案 2 :(得分:1)

这是一个用户定义的函数,可能很有用。您可以查看一下:

rowVars