检查每一行是否包含 R 中数据框中的某个值的最快方法?
Fastest way to check if each row contains some value in dataframe in R?
我有一个包含大约 300000 行和 600 列的数据框。我想删除至少在其中一列中包含字符串 "NULL" 的所有行。如果不对行和列使用 for 循环,我将如何实现它?
在这种情况下,数据表会比普通数据帧工作得更快吗?
我们可以用rowSums
(应该很快)
df1[!rowSums(df1=='NULL'),]
或者另一种选择是 any
和 apply
df1[!apply(df1=='NULL', 1, any),]
如果我们需要 data.table
解决方案,
setDT(df1)[df1[,!Reduce(`+` , lapply(.SD, `==`, 'NULL'))]]
如果我们使用 na.strings='NULL' in the
read.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 值的行。
我有一个包含大约 300000 行和 600 列的数据框。我想删除至少在其中一列中包含字符串 "NULL" 的所有行。如果不对行和列使用 for 循环,我将如何实现它?
在这种情况下,数据表会比普通数据帧工作得更快吗?
我们可以用rowSums
(应该很快)
df1[!rowSums(df1=='NULL'),]
或者另一种选择是 any
和 apply
df1[!apply(df1=='NULL', 1, any),]
如果我们需要 data.table
解决方案,
setDT(df1)[df1[,!Reduce(`+` , lapply(.SD, `==`, 'NULL'))]]
如果我们使用 na.strings='NULL' in the
read.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.casesdf_complete <- df[complete.cases(df),]
Returns 仅那些不包含任何 NA 值的行。