我有一个简单的问题
我有一个包含许多测量列的数据框。我想计算具有相同(标题)名称的列的平均值..我使用下面的代码(在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,但它没有用。
任何想法如何使用相同的代码来计算标准差以及平均值?
答案 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)
这是一个用户定义的函数,可能很有用。您可以查看一下: