检查每一行是否包含 R 中数据框中的某个值的最快方法?

Fastest way to check if each row contains some value in dataframe in R?

我有一个包含大约 300000 行和 600 列的数据框。我想删除至少在其中一列中包含字符串 "NULL" 的所有行。如果不对行和列使用 for 循环,我将如何实现它?

在这种情况下,数据表会比普通数据帧工作得更快吗?

我们可以用rowSums(应该很快)

df1[!rowSums(df1=='NULL'),]

或者另一种选择是 anyapply

df1[!apply(df1=='NULL', 1, any),]

如果我们需要 data.table 解决方案,

setDT(df1)[df1[,!Reduce(`+` , lapply(.SD, `==`, 'NULL'))]]

如果我们使用 na.strings='NULL' in theread.table/read.csv`(如@Roland 所述)

NULL 元素读取为 NA
 setDT(df1)[df1[, !Reduce(`+`,lapply(.SD, is.na))]]

数据

set.seed(24)
df1 <- data.frame(V1= sample(c(LETTERS[1:3],'NULL'), 20, replace=TRUE), 
        V2= sample(c(LETTERS[1:5], 'NULL'), 20, replace=TRUE),
       V3= sample(c(LETTERS[1:8], 'NULL'), 20, replace=TRUE), stringsAsFactors=FALSE)

如果您使用选项 na.strings = c("NA", "NULL")

读入数据,则可以使用 complete.cases
df_complete <- df[complete.cases(df),]

Returns 仅那些不包含任何 NA 值的行。