对数据表进行高效的行操作 [英] efficient row-wise operations on a data.table

查看:93
本文介绍了对数据表进行高效的行操作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要找到许多行的最小值(+60)

相对较大 data.frame (〜250,000 x 3)或者我可以
等效地在 xts 上工作。

I need to find the row-wise minimum of many (+60)
relatively large data.frame (~ 250,000 x 3) (or I can equivalently work on an xts).

set.seed(1000)
my.df <- sample(1:5, 250000*3, replace=TRUE)
dim(my.df) <- c(250000,3)
my.df <- as.data.frame(my.df)
names(my.df) <- c("A", "B", "C")

数据框 my.df p>

The data frame my.df looks like this

> head(my.df)

  A B C
1 2 5 2
2 4 5 5
3 1 5 3
4 4 4 3
5 3 5 5
6 1 5 3

我试过

require(data.table)
my.dt <- as.data.table(my.df)

my.dt[, row.min:=0]  # without this: "Attempt to add new column(s) and set subset of rows at the same time"
system.time(
  for (i in 1:dim(my.dt)[1]) my.dt[i, row.min:= min(A, B, C)]
)

在我的系统上,这需要〜400秒。它工作,但我不相信这是使用 data.table 的最佳方式。
我可以正确使用 data.table 吗?

On my system this takes ~400 seconds. It works, but I am not confident it is the best way to use data.table. Am I using data.table correctly? Is there a more efficient way to do simple row-wise opertations?

推荐答案

或者,只要 pmin

   my.dt <- as.data.table(my.df)
   system.time(my.dt[,row.min:=pmin(A,B,C)])
     user  system elapsed 
     0.02    0.00    0.01 
   head(my.dt)
     A B C row.min
[1,] 2 5 2       2
[2,] 4 5 5       4
[3,] 1 5 3       1
[4,] 4 4 3       3
[5,] 3 5 5       3
[6,] 1 5 3       1

这篇关于对数据表进行高效的行操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆