选择变量data.table

时间:2018-11-19 12:35:29

标签: r data.table

我正在编写一个函数,用于根据条件从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的代码以相同的方式工作?

谢谢。

1 个答案:

答案 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[]

如果您想保证原始对象,例如dtdd的功能不变,您可以使用dt=copy(dd)来制作对象的副本并保持原样不变。