R data.table 用户自定义函数

R data.table user defined function

我正在从在 R 中使用 data.frame 过渡到 data.table 以获得更好的性能。转换代码的主要部分之一是应用自定义函数,从在 data.frame 上应用到在 data.table 中使用它。

假设我有一个简单的数据table,dt1.

x y z---header

1 9 j

4 1 n

7 1 n

我正在尝试根据 x、y、z 的值计算 dt1 中的另一个新列 我尝试了 2 种方法,它们都给出了正确的结果,但速度更快的方法会发出警告。因此,在我使用更快的版本转换现有代码之前,要确保警告没有什么严重的。

(1) dt1[,a:={if((x<1) & (y>3) & (j == "n")){6} else {7}}]

(2) dt1[,a:={if((x<1) & (y>3) & (j == "n")){6} else {7}}, by = 1:nrow(x)]

版本 1 运行s 比版本 2 快,但会发出警告“条件的长度 > 1,并且只会使用第一个元素” 但结果是好的。 第二个版本稍慢但没有给出警告。 一旦我开始编写复杂的函数,我想确保第一个版本不会给出不稳定的结果。

请将此问题视为一般问题,以 运行 用户定义的函数来访问给定行中的不同列值并计算该行的新列值。

感谢您的帮助。

如果 'x'、'y' 和 'z' 是 'dt1' 的列,请尝试矢量化 ifelse

dt1[, a:=ifelse(x<1 & y >3 & z=='n', 6, 7)] 

或者用7创建'a',然后根据逻辑索引将6分配给'a'。

dt1[, a := 7][x<1 & y >3 & z=='n', a:=6][]

使用函数

getnewvariable <- function(v1, v2, v3){
   ifelse(v1 <1 & v2 >3 & v3=='n', 6, 7)
}

 dt1[, a:=getnewvariable(x,y,z)][]

数据

df1 <- structure(list(x = c(0L, 1L, 4L, 7L, -2L), y = c(4L, 9L, 1L, 
1L, 5L), z = c("n", "j", "n", "n", "n")), .Names = c("x", "y", 
"z"), class = "data.frame", row.names = c(NA, -5L))

dt1 <- as.data.table(df1)