【问题标题】:Average over list by row in RR中逐行列出的平均值
【发布时间】:2012-06-27 19:40:55
【问题描述】:

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

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

【问题讨论】:

  • 嗯,这里的实际答案是您根本不应该那样组织您的数据。您应该有多个测量列,并在适当的地方使用 NA。重新组织数据后,进行所需的计算就很简单了。
  • 它可以从这个表单中拆分出来,还是我必须在读取数据的早期阶段进行干预?
  • 是的,看我的回答。我在那里使用的成语(do.callrbind)也可以在早期使用。

标签: r list dataframe


【解决方案1】:

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

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 一些类似的功能。

【讨论】:

    【解决方案2】:

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

    df$means <- rowMeans(df$Measurements)
    

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

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

    【讨论】:

    • 这不适用于测量。我已将 dput 结构添加到问题中,以便您可以看到我正在使用的内容。它说这是一个列表
    • @Amyunimus,sapply 方法应该适用于您的数据。
    猜你喜欢
    • 2018-03-14
    • 2014-10-08
    • 2015-10-19
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多