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)
我正在从在 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)