我有一个数据框,其中测量值按行列出。
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")
答案 0 :(得分:4)
看来Measurements
是data.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一些类似的功能。