如何在R中聚合来自不同数据帧的多行?

时间:2016-01-11 12:43:36

标签: r merge apply lapply

假设我有3个数据框,名为a,b,c包含观察值和预测值5倍。

> a
  fold observerd predicted
1    1        10        20
2    2        20        30
3    3        30        40
4    4        40        50
5    5        50        60
> b
  fold observerd predicted
1    1        15        25
2    2        25        35
3    3        35        45
4    4        45        55
5    5        55        65
> c
  fold observerd predicted
1    1        16        26
2    2        26        36
3    3        36        46
4    4        46        56
5    5        56        66

现在,我希望合并每个折叠的观察值和预测值,如下所示。

> d
  fold observerd predicted
1    1        10        20
2    1        15        25
3    1        16        26
> e
  fold observerd predicted
1    2        20        30
2    2        25        35
3    2        26        36
..etc

这里我的最终目标是确定每个折叠的观察值和预测值之间的各种统计参数(相关系数R,RMSE等)(即折叠1,R = 1,折叠2,R = 0.98像这一点)。

实际上,我总共有48个数据帧,每个数据帧包含82个数据帧。那么,我怎么能通过使用apply / loop /类似的东西来完成这项工作呢?

1 个答案:

答案 0 :(得分:4)

我的建议是在单个data.frame中工作。然后,您可以稍后将任何计算应用于该data.frame的子部分。一种方法是使用dplyr包。请看这里的例子。

加载数据

a <- read.table(header = TRUE, text = '
fold observerd predicted
1    1        10        20
2    2        20        30
3    3        30        40
4    4        40        50
5    5        50        60')
b <- read.table(header = TRUE, text = '
fold observerd predicted
1    1        15        25
2    2        25        35
3    3        35        45
4    4        45        55
5    5        55        65')
c <- read.table(header = TRUE, text = '
fold observerd predicted
1    1        16        26
2    2        26        36
3    3        36        46
4    4        46        56
5    5        56        66')

dplyr

bind_rows

结合使用
library(dplyr)
dat <- bind_rows(a, b, c, .id = 'table')

获取group_bysummarize

的统计信息
# For example, calculate the correlation coefficient and the sum of squares per fold.
dat %>%
  group_by(fold) %>%
  summarize(r = cor(observerd, predicted),
            ss = sum((observerd - predicted) ^ 2))

do允许更复杂的东西(比如模型拟合)。请参阅?do

基础R

如果你想留在基地R,我仍然会推荐类似的方法。

rbind

结合使用
dat2 <- rbind(a, b, c) # no identifier here

获取splitsapply

的统计信息
# For example, get the correlation coefficient per fold
spl <- split(dat2, dat2$fold)
sapply(spl, function(d) cor(d$observerd, d$predicted))

(我觉得你拼错了。)