在 R 中使用 data.table 和 is.na(x) 在函数内进行子集化

Subsetting within a function using data.table and is.na(x) in R

我试图在一个函数中对 data.table 进行子集化,但使用 !is.na(x) 进行子集化无效。我知道它 可以 工作,因为当我在一个更简单的问题上构建我的示例时,子集调用工作正常。

library(data.table)
library(ggpubr)

tj = as.data.table(cbind(Name = c("Tom", "Tom", "Tim", "Jerry", NA, "Jerry", "Tim", NA), 
                         var1 = c(12, 12, 20, 30, 31, 21, 21, 31), 
                         var2 = c(12, 11, 27, 32, 31, 11, 21, 41),
                         var3 = c(10, 10,11, 13, 12, 12, 11, 10), 
                         time = as.numeric(c(1, 2, 1,1, 1,2,2,2))))

plot.tj<- function(dat = tj, color = NULL) {
  
  name <- names(dat)[2:4] # a factor of names to loop over
  
  for (i in seq_along(name)) {
    plotms <- ggline(dat[!is.na(color),], x = "time", y = name[i], color = color)
    print(plotms)
  
    }
}

plot.tj(color = "Name")

预期输出是 3 个变量图,但没有 NA 组。

问题是你的变量 color 是一个字符,所以你必须用 get 调用它以在你的 data.table 中进行子集化。这有效:

plot.tj<- function(dat = tj, color = NULL) {
  
  name <- names(dat)[2:4] # a factor of names to loop over
  
  for (i in seq_along(name)) {
    plotms <- ggline(dat[!is.na(get(color)),], x = "time", y = name[i], color = color)
    print(plotms)
    
  }
}

plot.tj(color = "Name")