汇总在R的列表中

时间:2017-03-14 06:56:57

标签: r loops aggregate mean lapply

我希望在数据框列表中找到值的平均值。

每个数据框(有70个东西)都有一个日期和值列表。我想找到每个日期的值的平均值。这是一个片段。

数据框名为Quantimodo

Measurement.Event.Time  Variable.Name   Value
30/11/2016 1:48 Activeness  2
30/11/2016 8:57 Activeness  1
3/12/2016 1:21  Activeness  2
4/12/2016 10:02 Activeness  2
5/12/2016 10:01 Activeness  3
8/12/2016 2:21  Activeness  2
9/12/2016 7:41  Activeness  2
12/12/2016 19:35    Activeness  2
14/12/2016 16:13    Activeness  1
15/12/2016 15:36    Activeness  2
15/12/2016 18:22    Activeness  3
17/12/2016 8:50 Activeness  3
18/12/2016 9:15 Activeness  3
18/12/2016 17:46    Activeness  2
10/01/2017 18:02    Activeness  1
15/01/2017 11:03    Activeness  4
26/02/2017 14:31    Activeness  3
1/03/2017 12:04 Activeness  2
2/03/2017 9:58  Activeness  2
28/11/2016 8:00 Alertness   4
29/11/2016 8:00 Alertness   4

Quantimodo$Measurement.Event.Time <- as.Date(Quantimodo$Measurement.Event.Time, "%d/%m/%Y")

Quanti_list = split(Quantimodo, f = Quantimodo$Variable.Name)

Quantireduce<-Reduce(function(x,y) merge(x, y, by = "Measurement.Event.Time", all.x = TRUE, all.y = TRUE),
       list(Quanti_list))

接下来我该怎么办?根据我的想法,我有每个Variable.Name的列表。我想找到每个价值的平均值。

我已经研究过循环,聚合和lapply,但我无法适应我在Stackoverflow上发现的东西。我是不是错了?

感谢。

2 个答案:

答案 0 :(得分:2)

使用K可以轻松处理一个大型data.table(只要数据结构允许),而不是数据帧列表。

我们假设data.table是大数据框架,我们想要计算每个日期和每个变量的均值。使用Quantimodo,我们可以:

data.table

请注意,library(data.table) setDT(Quantimodo)[, mean(Value), by = .(as.Date(Measurement.Event.Time), Variable.Name)] # as.Date Variable.Name V1 # 1: 2016-11-30 Activeness 1.5 # 2: 2016-12-03 Activeness 2.0 # 3: 2016-12-04 Activeness 2.0 # ... #15: 2017-03-01 Activeness 2.0 #16: 2017-03-02 Activeness 2.0 #17: 2016-11-28 Alertness 4.0 #18: 2016-11-29 Alertness 4.0 的转换是在分组(Measurement.Event.Time)内即时完成的。

如果您有一个具有相同结构的data.frames列表,我建议使用by = ...创建一个可以一个处理的大型data.table。例如

rbindlist()

请注意,参数rbindlist(Quanti_list, idcol = "id")[ , mean(Value), by = .(id, as.Date(Measurement.Event.Time), Variable.Name)] # id as.Date Variable.Name V1 # 1: Activeness 2016-11-30 Activeness 1.5 # 2: Activeness 2016-12-03 Activeness 2.0 # 3: Activeness 2016-12-04 Activeness 2.0 #15: Activeness 2017-03-01 Activeness 2.0 #16: Activeness 2017-03-02 Activeness 2.0 #17: Alertness 2016-11-28 Alertness 4.0 #18: Alertness 2016-11-29 Alertness 4.0 添加了一个id列,用于标识每行所源自的列表元素(在本例中,它与idcol = "id"相同)。此处在分组中使用Variable.Name进行演示。

答案 1 :(得分:1)

你提到你看过aggregate如果你能解释我为什么不适合你的话会很有用。

  

我已经研究了循环,聚合和lapply,但我无法适应   我在Stackoverflow上发现了什么。我是不是错了?

从广义上讲,可以通过以下方式实现在列表中存储的数据集中查找变量的方法或任何其他聚合值。

# Copy / paste for the provided data
dfA = read.delim(pipe("pbpaste"), sep="", header=TRUE, row.names = NULL)
dfB <- dfA

lapply(X = list(dfA, dfB),
       FUN = function(x) {
           aggregate(x = x, by = list(unique.values = x$row.names), mean)
       })

这会产生:

[[1]]
   unique.values row.names Measurement.Event.Time Variable.Name Value
1      1/03/2017        NA                     NA            NA   2.0
2     10/01/2017        NA                     NA            NA   1.0
3     12/12/2016        NA                     NA            NA   2.0
4     14/12/2016        NA                     NA            NA   1.0

如果您想稍后合并数据,可以将lapply封装在do.calldo.call("rbind", lapply(...))中。

row.names反映了您的第一栏,因为我已快速复制/粘贴提供的代码段。我也没有改变列类型。