簡體   English   中英

選擇變量data.table

[英]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[]

如果要保證原始對象(例如dtdd在功能上沒有改變,可以使用dt=copy(dd)制作該對象的副本,並保持原始狀態不變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM