从我的直觉开始 - 我认为有一些方法可以使用" apply"没有循环遍历我文件中的每一个条目,但我无法弄明白。
我有一个非常大的文件。大约4,000,000行,6列。为了便于讨论,这些列中只有3列是相关的。它们是day
,grade1
和grade2
我想使用上面提到的.txt中的3列创建一个包含多个字段的矩阵。
我想要day
,grade1Wins
,grade2Wins
,ties
,grade1Score
,grade2Score
,grade1Avg
和{{1 }}。这些都是每天。
所以我的输出矩阵将有8列,行数等于有天数。
我将这些定义如下。
grade2Avg
:从0开始,每行Grade1Wins
>递增1 Grade1
。
|Grade2|
:从0开始,为Grade2Wins
>的每一行增加1 |Grade2|
。
Grade1
:从0开始,对ties
== Grade1
|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"没有循环遍历我文件中的每一个条目,但我无法弄明白。
答案 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