提前感谢您的帮助。 我正在使用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的新手,我对不同的逻辑感到很遗憾(但非常有趣)。
我已经看到了关于这个主题的其他问题但我根本不清楚。
答案 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.zoo
和vignette("zoo-read")
。