簡體   English   中英

從data.table中刪除所有名稱包括“ question”的列均不適用的行

[英]Remove rows from data.table where all columns with names including “question” are NA

我有一項調查得出的數據,對於該問題的任何回答都被認為是有效的,無論是回答之前還是之后的問題。

所有用於響應的數據都在data.table中,其名稱以“ question”開頭的列中

> dt.x <- data.table(
    row = 1:5,
    question_a = c(NA,NA,"A","B","C"),
    question_b = c(NA,"A","B","C","D")
)

> dt.x
   row question_a question_b
1:   1       <NA>       <NA>
2:   2       <NA>          A
3:   3          A          B
4:   4          B          C
5:   5          C          D

我的目標是刪除以“問題”開頭的任何列中都沒有數據的行,但是其他列中可能有數據,例如示例中的行列。

   row question_a question_b
1:   2       <NA>          A
2:   3          A          B
3:   4          B          C
4:   5          C          D

在列名中添加grep時該如何做? 我正在嘗試類似

> dt.x[!all(is.na(get(grep("question", names(dt.x), value = T))))]
   row question_a question_b
1:   1       <NA>       <NA>
2:   2       <NA>          A
3:   3          A          B
4:   4          B          C
5:   5          C          D

但沒有得到我想要的結果。

您可以使用rowSums並計算每行的NA值,然后選擇沒有全部NA

question_cols <- sum(grepl("^question", names(dt.x)))
dt.x[rowSums(is.na(dt.x[, -1])) != question_cols, ]

#   row question_a question_b
#1:   2       <NA>          A
#2:   3          A          B
#3:   4          B          C
#4:   5          C          D

或使用dplyrfilter_at

library(dplyr)
dt.x %>%
   filter_at(vars(starts_with("question")), any_vars(!is.na(.)))

對於您的情況,您可以簡單地執行以下操作:

dt.x[, .SD[!all(is.na(.SD))], by = row]

如果存在更多列:

dt.x[dt.x[, !all(is.na(.SD)), by = row, .SDcols = patterns("^question")]$V1]

暫無
暫無

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

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