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

Jef*_*_hk 0 aggregate r 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
...
Run Code Online (Sandbox Code Playgroud)

假设我想构造一个具有以下格式的矩阵:行:天

    H1       H2       H3       H4
D1  Values   Values   Values   Values
D2  Values   Values   Values   Values
D3  Values   Values   Values   Values
Run Code Online (Sandbox Code Playgroud)

并且:

    average(H1,H2)       average(H3,H4)
D1  Values               Vales
D2  Values               Vales
D3  Values               Vales
Run Code Online (Sandbox Code Playgroud)

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

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

A5C*_*2T1 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
Run Code Online (Sandbox Code Playgroud)

第二,使用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
Run Code Online (Sandbox Code Playgroud)

第三,使用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
Run Code Online (Sandbox Code Playgroud)