R中按行列出的平均值

时间:2012-06-27 19:40:55

标签: r list dataframe

我有一个数据框,其中测量值按行列出。

  Subject                 Measurements
1      s1  -0.4, -0.9, -1.1, -0.1,  0.1
2      s2  -1.4, -1.7, -1.7, -0.6, -1.7
3      s3  -1.0, -0.1, -0.6, -0.5, -0.1
4      s4  -0.2, -0.5, -0.2,  0.1, -0.7
5      s5   0.7,  0.2,  0.4,  0.7,  0.2
6      s6  -0.3, -0.1,  0.1, -0.2, -0.1

如何平均/找到标准差/其他列表操作并将输出添加到数据框中的新列(例如“mean”)

修改

这是我正在使用的数据结构:

structure(list(Subject = structure(1:6, .Label = c("s1", "s2", 
"s3", "s4", "s5", "s6"), class = "factor"), Measurements = list(
c(-0.4, -0.9, -1.1, -0.1, 0.1), c(-1.4, -1.7, -1.7, -0.6, 
-1.7), c(-1, -0.1, -0.6, -0.5, -0.1), c(-0.2, -0.5, -0.2, 
0.1, -0.7), c(0.7, 0.2, 0.4, 0.7, 0.2), c(-0.3, -0.1, 0.1, 
-0.2, -0.1))), .Names = c("Subject", "Measurements"), row.names = c(NA, 
6L), class = "data.frame")

2 个答案:

答案 0 :(得分:4)

看来Measurementsdata.frame(df)中的矩阵。

df$means <- rowMeans(df$Measurements)

对于更通用的解决方案,您可以使用对于给定函数应用Margin = 1。

df$SDs <- apply(df$Measurements, 1, sd)

如果Measurements实际上是真正的list,则使用

df$SDs <- lapply(df$Measurements, sd)

这样可以获得最佳效果,但现在您的SDs列为list,因此要将其设为vector,我会选择......

df$SDs <- sapply(df$Measurements, sd)

(当我创建一个包含列表的data.frame时,它看起来并不像那样,所以我认为它最初并不是一个列表。)

答案 1 :(得分:4)

如果您更有效地存储数据,这将变得更加容易:

dat<- structure(list(Subject = structure(1:6, .Label = c("s1", "s2", 
"s3", "s4", "s5", "s6"), class = "factor"), Measurements = list(
c(-0.4, -0.9, -1.1, -0.1, 0.1), c(-1.4, -1.7, -1.7, -0.6, 
-1.7), c(-1, -0.1, -0.6, -0.5, -0.1), c(-0.2, -0.5, -0.2, 
0.1, -0.7), c(0.7, 0.2, 0.4, 0.7, 0.2), c(-0.3, -0.1, 0.1, 
-0.2, -0.1))), .Names = c("Subject", "Measurements"), row.names = c(NA, 
6L), class = "data.frame")

> dat <- data.frame(subject = dat$Subject,do.call(rbind,dat$Meas))
> dat$means <- apply(dat[,-1],1,mean)
> dat
  subject   X1   X2   X3   X4   X5 means
1      s1 -0.4 -0.9 -1.1 -0.1  0.1 -0.48
2      s2 -1.4 -1.7 -1.7 -0.6 -1.7 -1.42
3      s3 -1.0 -0.1 -0.6 -0.5 -0.1 -0.46
4      s4 -0.2 -0.5 -0.2  0.1 -0.7 -0.30
5      s5  0.7  0.2  0.4  0.7  0.2  0.44
6      s6 -0.3 -0.1  0.1 -0.2 -0.1 -0.12

每个测量都在自己的列中,您可以简单地使用apply(或rowMeans)os一些类似的功能。