我有一项调查得出的数据,对于该问题的任何回答都被认为是有效的,无论是回答之前还是之后的问题。
所有用于响应的数据都在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
Run Code Online (Sandbox Code Playgroud)
我的目标是删除以“问题”开头的任何列中都没有数据的行,但是其他列中可能有数据,例如示例中的行列。
row question_a question_b
1: 2 <NA> A
2: 3 A B
3: 4 B C
4: 5 C D
Run Code Online (Sandbox Code Playgroud)
在列名中添加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
Run Code Online (Sandbox Code Playgroud)
但没有得到我想要的结果。
您可以使用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
Run Code Online (Sandbox Code Playgroud)
或使用dplyr,filter_at
library(dplyr)
dt.x %>%
filter_at(vars(starts_with("question")), any_vars(!is.na(.)))
Run Code Online (Sandbox Code Playgroud)