在R中重新格式化数据(大量的行)

时间:2012-12-14 10:05:00

标签: r aggregate reshape

提前感谢您的帮助。 我正在使用R,让我们说我有一个数据表(或最终与动物园的时间序列),格式如下:

Col1: time   Values
Day1 H1      Value
Day1 H2      Value
Day1 H3      Value
Day1 H4      Value

Day2 H1      Value
Day2 H2      Value
Day2 H3      Value
Day2 H4      Value

Day3 H1      Value
...

假设我想构建一个格式如下的矩阵: 行:天

    H1       H2       H3       H4
D1  Values   Values   Values   Values
D2  Values   Values   Values   Values
D3  Values   Values   Values   Values

还有:

    average(H1,H2)       average(H3,H4)
D1  Values               Vales
D2  Values               Vales
D3  Values               Vales

在某些语言(例如C ++)中,我们可能会继续使用“for”,但我不确定这是继续进行此操作的最佳方法。 非常感谢,我是R的新手,我对不同的逻辑感到很遗憾(但非常有趣)。

我已经看到了关于这个主题的其他问题但我根本不清楚。

3 个答案:

答案 0 :(得分:5)

这可以通过一些基本的reshape工作完成,aggregate()within()可以通过以下方式完成:

首先,一些示例数据非常有用:

set.seed(1)
temp <- data.frame(Col1 = paste("Day", rep(1:4, each = 4), sep=""),
                   times = paste("H", rep(1:4, times = 4), sep=""),
                   Values = runif(16, min=0, max=10))
temp
#    Col1 times    Values
# 1  Day1    H1 2.6550866
# 2  Day1    H2 3.7212390
# 3  Day1    H3 5.7285336
# 4  Day1    H4 9.0820779
# 5  Day2    H1 2.0168193
# 6  Day2    H2 8.9838968
# 7  Day2    H3 9.4467527
# 8  Day2    H4 6.6079779
# 9  Day3    H1 6.2911404
# 10 Day3    H2 0.6178627
# 11 Day3    H3 2.0597457
# 12 Day3    H4 1.7655675
# 13 Day4    H1 6.8702285
# 14 Day4    H2 3.8410372
# 15 Day4    H3 7.6984142
# 16 Day4    H4 4.9769924

其次,使用reshape从长格式转换为宽格式

tempwide <- reshape(temp, direction = "wide", idvar="Col1", timevar="times")
tempwide
#    Col1 Values.H1 Values.H2 Values.H3 Values.H4
# 1  Day1  2.655087 3.7212390  5.728534  9.082078
# 5  Day2  2.016819 8.9838968  9.446753  6.607978
# 9  Day3  6.291140 0.6178627  2.059746  1.765568
# 13 Day4  6.870228 3.8410372  7.698414  4.976992

第三,在所需的列子集上使用rowMeans。如果您愿意,也可以使用aggregate,但这是转换原始data.frame的便捷方式。

tempwide <- within(tempwide, {
  mean.H1H2 <- rowMeans(tempwide[2:3])
  mean.H3H4 <- rowMeans(tempwide[4:5])
})
tempwide
#    Col1 Values.H1 Values.H2 Values.H3 Values.H4 mean.H3H4 mean.H1H2
# 1  Day1  2.655087 3.7212390  5.728534  9.082078  7.405306  3.188163
# 5  Day2  2.016819 8.9838968  9.446753  6.607978  8.027365  5.500358
# 9  Day3  6.291140 0.6178627  2.059746  1.765568  1.912657  3.454502
# 13 Day4  6.870228 3.8410372  7.698414  4.976992  6.337703  5.355633

答案 1 :(得分:1)

确实有很多方法可以做到这一点。您可以使用data.table包进行聚合。为什么要使用data.table?这是(见here)。

利用Ananda Mahto的答案,我们在tempwide点离开,创建temp wide.table

require(data.table)
set.seed(1)
temp <- data.frame(Col1 = paste("Day", rep(1:4, each = 4), sep=""),
                   times = paste("H", rep(1:4, times = 4), sep=""),
                   Values = runif(16, min=0, max=10))

tempwide <- reshape(temp, direction = "wide", idvar="Col1", timevar="times")

tempwide.table <- data.table(tempwide)

tempwide.table[, H1n2 := sum(Values.H1, Values.H2)/2, by=Col1]
tempwide.table[, H3n4 := sum(Values.H3, Values.H4)/2, by=Col1]

所以,打印tempwide.table会产生:

   Col1 Values.H1 Values.H2 Values.H3 Values.H4     H1n2     H3n4
1: Day1  7.176185  9.919061 3.8003518  7.774452 8.547623 5.787402
2: Day2  9.347052  2.121425 6.5167377  1.255551 5.734239 3.886144
3: Day3  2.672207  3.861141 0.1339033  3.823880 3.266674 1.978891
4: Day4  8.696908  3.403490 4.8208012  5.995658 6.050199 5.408230

语法很灵活,对于很多列来说,你可能想要这样的东西:

tempwide.table[, list(mean(sum(Values.H1, Values.H2)/2)), by=Col1]

答案 2 :(得分:1)

尝试此操作(如果来自文件并且日期不是字面Day1等,则进行适当的更改):

Lines <- "Col1 times    Values
Day1    H1 2.6550866
Day1    H2 3.7212390
Day1    H3 5.7285336
Day1    H4 9.0820779
Day2    H1 2.0168193
Day2    H2 8.9838968
Day2    H3 9.4467527
Day2    H4 6.6079779
Day3    H1 6.2911404
Day3    H2 0.6178627
Day3    H3 2.0597457
Day3    H4 1.7655675
Day4    H1 6.8702285
Day4    H2 3.8410372
Day4    H3 7.6984142
Day4    H4 4.9769924"

library(zoo)
z <- read.zoo(text = Lines, header = TRUE, index = 1, split = 2, FUN = identity)

结果是:

> z
           H1        H2       H3       H4
Day1 2.655087 3.7212390 5.728534 9.082078
Day2 2.016819 8.9838968 9.446753 6.607978
Day3 6.291140 0.6178627 2.059746 1.765567
Day4 6.870228 3.8410372 7.698414 4.976992

有关详细信息,请参阅?read.zoovignette("zoo-read")