【问题标题】:Reformatting data in R (huge amount of lines)重新格式化 R 中的数据(大量行)
【发布时间】:2012-12-02 07:46:35
【问题描述】:

提前感谢您的帮助。 我正在使用 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 新手,对不同的逻辑(但非常有趣)感到很迷茫。

我看到了关于这个主题的其他问题,但我一点都不清楚。

【问题讨论】:

  • 带有一些for的双循环?我有 200,000 行,所以我很担心性能

标签: r aggregate reshape


【解决方案1】:

这可以通过一些基本的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

【讨论】:

  • 非常感谢。你有适合初学者的“书”或“pdf”吗?
  • @user1677319,对不起,不是真的。查看 CRAN 的 Contributed Documentation 页面。那里有很多很好的指南。另外,查看CRAN Task Views,您是否可以根据您通常从事的研究/分析领域查看有用的功能和软件包列表。
  • google 或其他论坛组也很有用,您只需教“您的 google”搜索正确的网页
【解决方案2】:

确实有很多方法可以做到这一点。您可以使用 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]

【讨论】:

    【解决方案3】:

    试试这个(如果它来自文件并且日期不是字面上的 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") 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      相关资源
      最近更新 更多