[英]selecting variables 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
的代碼以相同的方式工作?
謝謝。
通過變量進行引用並不像可能的那么簡單,但是使用data.table來與列名本身一起工作仍然很好。 有關如何使用自定義變量名稱的信息, 請參見此 : 通過保存在變量中的名稱引用data.table列
這是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)
制作該對象的副本,並保持原始狀態不變。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.