当整行值与正则表达式或一组值匹配时,删除data.frame中的行
我有一个这样的数据框(正确的值这只是一个例子): 导致错误的结果:当整行值与正则表达式或一组值匹配时,删除data.frame中的行,r,R,我有一个这样的数据框(正确的值这只是一个例子): 导致错误的结果: a b c d e 3 4 7 3 3 3 NO_DATA 这就是我想要的结果: a b c d e 6 <NA> 2 2 2 2 7 3 3
a b c d e
3
4
7 3 3 3 NO_DATA
这就是我想要的结果:
a b c d e
6 <NA> 2 2 2 2
7 3 3 3 NO_DATA
abcde
6 2 2 2 2
7 3无数据
我想使用正则表达式,因为可能的值可能会有所不同,这里有一种方法可以删除使用正则表达式(即,
grepl()
)和is.na()
来识别na
值
首先使用rappy()
创建一个TRUE
/FALSE
数据帧进行过滤。然后有两种方法可以从那里过滤。请注意,如果使用rowMeans()
拥有非常大的数据帧,则会将其强制转换为一个矩阵(因此这可能会很慢)。通常不是一个问题,而是一个重要的警告。希望这有帮助
# Replace each cell with T/F based on the function (grepl() / is.na())
idx_df <- rapply(df, function(x) grepl("^(\\s*|NO_DATA)$", x) | is.na(x), how = "replace")
# Check if there were no matches in the function (i.e., there is at least one FALSE)
idx <- do.call(pmin, idx_df) == 0
# Check is the rowMean is less than 1 (not all TRUE)
idx2 <- rowMeans(idx_df) < 1
identical(idx, idx2) # same result
[1] TRUE
df[idx, ]
a b c d e
6 <NA> 2 2 2 2
7 3 3 3 NO_DATA
#根据函数(grepl()/is.na())用T/F替换每个单元格
idx_df这里是一种使用regex(即grepl()
)和is.na()
来识别na
值的删除方法
首先使用rappy()
创建一个TRUE
/FALSE
数据帧进行过滤。然后有两种方法可以从那里过滤。请注意,如果使用rowMeans()
拥有非常大的数据帧,则会将其强制转换为一个矩阵(因此这可能会很慢)。通常不是一个问题,而是一个重要的警告。希望这有帮助
# Replace each cell with T/F based on the function (grepl() / is.na())
idx_df <- rapply(df, function(x) grepl("^(\\s*|NO_DATA)$", x) | is.na(x), how = "replace")
# Check if there were no matches in the function (i.e., there is at least one FALSE)
idx <- do.call(pmin, idx_df) == 0
# Check is the rowMean is less than 1 (not all TRUE)
idx2 <- rowMeans(idx_df) < 1
identical(idx, idx2) # same result
[1] TRUE
df[idx, ]
a b c d e
6 <NA> 2 2 2 2
7 3 3 3 NO_DATA
#根据函数(grepl()/is.na())用T/F替换每个单元格
idx_df您可以使用以下方法进行子集:
df[rowSums(!sapply(df, function(x) trimws(x) %in% c("", "NO_DATA") | is.na(x))) > 0, ]
a b c d e
6 <NA> 2 2 2 2
7 3 3 3 NO_DATA
df[行和(!sapply(df,函数(x)trimws(x)%in%c(“,“无数据”)| is.na(x))>0,]
a、b、c、d、e
6 2 2 2 2
7 3无数据
您可以使用以下方法创建子集:
df[rowSums(!sapply(df, function(x) trimws(x) %in% c("", "NO_DATA") | is.na(x))) > 0, ]
a b c d e
6 <NA> 2 2 2 2
7 3 3 3 NO_DATA
df[行和(!sapply(df,函数(x)trimws(x)%in%c(“,“无数据”)| is.na(x))>0,]
a、b、c、d、e
6 2 2 2 2
7 3无数据
是否保留包含数值的行,而不是删除包含x、y或z的行,例如df[rowSums(suppressWarnings(sapply(df,as.numeric)),na.rm=TRUE)>0,]
?不,此数值只是一个示例,可以是任何字符串或数字,而不是删除包含x、y或z的行,您想保留包含数值的行吗,例如df[rowsumes(suppressWarnings(sapply(df,as.numeric)),na.rm=TRUE)>0,]
?不,这个数值只是一个例子,可以是任何字符串或数字c(“,“No_DATA”)
都可以作为黑名单,太好了。@Emeeus,该黑名单不适用于您的示例数据,因为您有“
和”
和“
”
如果它们都是相同的,那么我们可以做df[df==“NO_data”| df==”]c(“,“NO_data”)
将用作黑名单,太好了。@Emeeus,该黑名单不适用于您的示例数据,因为您有“
和”
和”
,如果它们都相同,那么我们可以执行df[df==“无数据”| df==”]