![](/img/trans.png)
[英]data.table: How do I pass a character vector to a function get data.table to treat its contents as column names?
[英]How to subset a data.table in i (eg finding NAs) based on a character vector of column names
這應該很容易,但谷歌和我都失敗了。 假設我有這些數據:
library(data.table)
mydata <- data.table(a = c(1, NA),
b = c(NA, NA),
pointer = c(1,2))
我想得到a
和b
都是NA
的行。 當然,我可以手動執行此操作,例如:
mydata[is.na(a) & is.na(b)]
但是這個問題在其他代碼中很深,我想根據列名的字符向量(或列表,或其他靈活的)來執行此操作,例如:
myvector <- c("a","b")
如果我知道向量有多少個元素,我可以再次手動執行此操作:
mydata[is.na(get(myvector[1])) & is.na(get(myvector[2]))]
但我不知道myvector
在我的應用程序中有多少元素。 如何在不指定myvector
中的條目數的情況下執行此操作? 本質上,我正在尋找類似with = F
但對於i
in data.table
的東西。 所以我想像這樣使用myvector
:
mydata[is.na(somefunction(myvector))]
我用get()
或as.formula()
嘗試了各種paste0(myvector, collapse = " & ")
組合,但它讓我無處可去。
我們可以用列名向量指定.SDcols
,遍歷.SD
的子集),用is.na
創建邏輯向量list
,然后用&
將list
Reduce
為單個邏輯向量(檢查帶有&
條件的list
或列的相應元素),使用它來子集數據行
library(data.table)
mydata[mydata[, Reduce(`&`, lapply(.SD, is.na)), .SDcols = myvector]]
-輸出
# a b pointer
#1: NA NA 2
或者使用mget
mydata[mydata[, Reduce(`&`, lapply(mget(myvector), is.na))]]
這是假設myvector
是字符向量的另一個解決方案:
library(data.table)
mydata[rowSums(!is.na(mydata[, ..myvector])) == 0]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.