我正在编写一个函数,用于根据条件从data.table变量中选择值。问题是,当变量名称与函数参数的名称不匹配时,将无法正确选择它。代码如下。
library(data.table)
dt <- data.table(x = c(1, 2, 3, NA, NA),
y = c(2, 4, 3, 5, NA))
dd <- data.table(p = c(1, 2, 3, NA, NA),
q = c(2, 4, 3, 5, NA))
is.data.table(dt)
is.data.table(dd)
variable_chooser <- function(dt, x , y ) {
dt[!is.na(x), z := x]
dt[is.na(x) & !is.na(y), z := y]
dt[is.na (x) & is.na(y), z := NA]
}
variable_chooser(dt, dt$x, dt$y)
variable_chooser(dd, dd$p, dd$q)
dt
dd
最后两个数据集看起来像这样。
> dt
x y z
1: 1 2 1
2: 2 4 2
3: 3 3 3
4: NA 5 5
5: NA NA NA
> dd
p q z
1: 1 2 1
2: 2 4 2
3: 3 3 3
4: NA 5 2
5: NA NA NA
dd
数据集具有z
的第一行而不是第四行的q
变量的第四行的值。使用dt
,代码可以正常工作。
如何使dd
的代码以相同的方式工作?
谢谢。
答案 0 :(得分:0)
通过变量进行引用并不是那么简单,但是使用data.table来与列名本身一起使用仍然是一件好事。请参阅此以获取有关如何使用自定义变量名称的信息: Referring to data.table columns by names saved in variables
这里是get
的示例。我已经对其进行了更改,以便它使用列名而不是列值。我先使用NA_real_
来设置NA列。
variable_chooser <- function(dt, xvar, yvar) {
dt[, z := NA_real_]
dt[!is.na(get(xvar)), z := get(xvar)]
dt[is.na(get(xvar)) & !is.na(get(yvar)), z := get(yvar)]
return(dt)
}
dt2 <- variable_chooser(dt=dt, xvar="x", yvar="y")
dd2 <- variable_chooser(dt=dd, xvar="p", yvar="q")
dt2[]
dd2[]
如果您想保证原始对象,例如dt
和dd
的功能不变,您可以使用dt=copy(dd)
来制作对象的副本并保持原样不变。