-1

我有一个数据框,其测量值按行存储为列表。

  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

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

编辑

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

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")
4

2 回答 2

4

它看起来像是你的(df)Measurements中的一个矩阵。data.frame

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 时,它​​看起来并不像那样,所以我一开始并不认为它真的是一个列表)。

于 2012-06-27T19:54:43.280 回答
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 一些类似的功能。

于 2012-06-27T21:42:24.287 回答