我有一个数据框:
mydf <- data.frame(
col1 = c("54", "abc", "123", "54 abc", "zzz", "a", "99"),
col2 = c("100", "200", "300", "400", "500", "600", "700"),
stringsAsFactors = FALSE
)
在此数据框中,我想用 NA 替换所有元素,除非它们满足以下条件之一:
- 严格来说是一个数字(例如“54”保留,“54 abc”丢弃)
- 属于 target_string
我不确定如何使用 apply 在 R 中执行此操作,因此我尝试编写一个循环:
target_string <- c("a", "zzz")
replace_with_na_old <- function(df, target_string) {
for (i in 1:nrow(df)) {
for (j in 1:ncol(df)) {
value <- df[i, j]
if (!grepl("^[0-9]+$", value) && !(value %in% target_string)) {
df[i, j] <- NA
}
}
}
return(df)
}
mydf_cleaned_old <- replace_with_na_old(mydf, target_string)
还有其他方法可以做到这一点吗?
注意:以下是如何用 %like% 替换 %in%:
replace_with_na_new <- function(df, target_string) {
for (i in 1:nrow(df)) {
for (j in 1:ncol(df)) {
value <- df[i, j]
if (!grepl("^[0-9]+$", value) && !any(sapply(target_string, function(pattern) grepl(pattern, value)))) {
df[i, j] <- NA
}
}
}
return(df)
}
您已经有了检查这一点所需的逻辑,您所需要做的就是对其进行矢量化。
apply*
现在,您可以使用基础 R 中的任何函数将此函数应用于每一列。或者如果您愿意,
dplyr
我们可以使用across
类似的结果。您可以替换所有不属于
target_string
且包含非数字字符的元素。您可以提前生成正则表达式模式,然后应用
grepl
,例如,给出