0

在此先感谢您的帮助。我正在使用 R,假设我有一个数据表(或最终带有 zoo 的时间序列),格式如下:

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 的新手,我对不同的逻辑很迷茫(但非常有趣)。

我已经看到有关该主题的其他问题,但我根本不清楚。

4

3 回答 3

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
于 2012-12-14T10:24:47.210 回答
1

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

利用 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]
于 2012-12-14T19:20:07.527 回答
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")了解更多信息。

于 2012-12-14T23:02:46.327 回答