【问题标题】:selecting variables data.table选择变量 data.table
【发布时间】:2018-11-19 12:35:29
【问题描述】:

我正在编写一个函数来根据条件从 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

最后2个数据集是这样的。

> 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 的代码以相同的方式工作?

谢谢。

【问题讨论】:

  • 我猜如果你这样做 variable_chooser &lt;- function(myData, x , y ) {... 那么 dt 也会失败。
  • 不,如果数据集名称不同,它会按预期工作。

标签: r data.table


【解决方案1】:

通过变量引用并不是那么简单,但是使用 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),复制对象,保持原件完好。

【讨论】:

  • 谢谢。这样可行。请问为什么要先加NA_real?即使没有它,它似乎也能工作。我实际上更喜欢使用变量名而不是值。
  • 我更喜欢先创建空白列结构,然后应用规则。我认为它更强大一些。我使用NA_real_ 的原因是因为xy 的类是数字的,如果您使用class(NA_real_),与class(NA) 相比,您会看到默认值是合乎逻辑的。它还缩短了代码,因为您现在有 2 条规则而不是 3 条规则。请参阅 rdocumentation.org/packages/base/versions/3.5.1/topics/NA 了解其他类
猜你喜欢
  • 1970-01-01
  • 2018-03-17
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2018-10-10
相关资源
最近更新 更多