簡體   English   中英

如何根據列名的字符向量對 i 中的 data.table 進行子集化(例如查找 NA)

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

我想得到ab都是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.

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