R - 处理速度/效率 - 从大文件创建+更新矩阵

时间:2016-04-15 04:46:57

标签: r performance matrix apply

从我的直觉开始 - 我认为有一些方法可以使用" apply"没有循环遍历我文件中的每一个条目,但我无法弄明白。

我有一个非常大的文件。大约4,000,000行,6列。为了便于讨论,这些列中只有3列是相关的。它们是daygrade1grade2

我想使用上面提到的.txt中的3列创建一个包含多个字段的矩阵。

我想要daygrade1Winsgrade2Winstiesgrade1Scoregrade2Scoregrade1Avg和{{1 }}。这些都是每天。

所以我的输出矩阵将有8列,行数等于有天数。

我将这些定义如下。

grade2Avg:从0开始,每行Grade1Wins>递增1 Grade1|Grade2|:从0开始,为Grade2Wins>的每一行增加1 |Grade2|Grade1:从0开始,对ties == Grade1

的每一行增加1

|Grade2|:原始分数值的总和。 Grade1Score:原始分数值的总和。

Grade2Score Grade1Score Grade1Avg : Grade2Avg:/ (numRows) /(numRows)

我希望这一切都是一个矩阵。因此,例如,我的数据可能看起来像......(仅显示2个相关列的子集)

Grade2Score

所以我的输出矩阵是

Day    Grade1    Grade2
1    2         -4
1    4         -4
2    10        -1

目前,我通过循环来做到这一点。 我的矩阵是预先定义的(#cols /#行预先确定,有一个空白矩阵,其中0和#等待编辑)。

我遍历制表符分隔的.txt文件的每一行。

我确定当前行的日期。这是我的行号。 我从`day` `grade1wins` `grade2wins` `ties` `grade1score` `grade2score` `grade1avg` `grade2avg` 1 0 1 1 6 -8 2 -4 2 1 0 0 10 -1 10 -1 grade1的行中提取值。

grade2

我认为有一些方法可以使用" apply"没有循环遍历我文件中的每一个条目,但我无法弄明白。

1 个答案:

答案 0 :(得分:3)

您可以在data.table包的帮助下完成此操作。

您可以在fread()函数的帮助下读取数据集,并将数据集保存到变量,例如data2。

现在,您可以通过以下代码应用所需的操作:

test_function <- function(dt){
    grade1wins <- length(which(dt$Grade1 > abs(dt$Grade2)))
    grade2wins <- length(which(dt$Grade1 < abs(dt$Grade2)))
    ties <- nrow(dt) - grade1wins - grade2wins
    grade1score <- sum(dt$Grade1)
    grade2score <- sum(dt$Grade2)
    grade1avg <- mean(dt$Grade1)
    grade2avg <- mean(dt$Grade2)

    return (list(grade1wins = grade1wins,grade2wins = grade2wins,
        ties = ties,grade1score = grade1score,grade2score = grade2score,
        grade1avg = grade1avg,grade2avg = grade2avg))
}

> as.matrix(data2[,test_function(.SD),by=Day])
     Day grade1wins grade2wins ties grade1score grade2score grade1avg grade2avg
[1,]   1          0          1    1           6          -8         3        -4
[2,]   2          1          0    0          10          -1        10        -1