df.cleaned <- df[-which(str_detect(df, "Not found")),]
&#34; DF&#34;是指由多个列和行组成的数据框。此数据框中的许多元素都包含某些字符单词。
我要做的是删除所有包含单词&#34; Not found&#34;要么作为整个元素值,要么作为其中的一部分。
到目前为止,上面的命令是我提出的,使用stringr包。但是,此命令似乎删除整行。我不想删除整行,我只想删除包含&#34;未找到&#34;的特定元素。
答案 0 :(得分:1)
如何获得行为:
toy[toy == "Not found"] <- ""
toy
# x y z n
# 1 m f 6
# 2 z t a 3
# 3 m 4
# 4 j 9
# 5 e 5
# 6 f n k 2
# 7 q f p 1
# 8 n 8
# 9 n k h 7
# 10 d u l 10
对于匹配与平等,你可以试试这个。我不确定它是否比@ r2evans方法提供了性能改进。编辑:显然,正如@ r2evans在评论中解释的那样,在幕后完成相同的转换。在这种情况下,它看起来不像平等解决方案那样干净,但由于转换不应该降低性能:
toy[matrix(grepl("Not found", as.matrix(toy)), nrow(toy))] <- ""
toy
# x y z n
# 1 m f 6
# 2 z t a 3
# 3 m 4
# 4 j 9
# 5 e 5
# 6 f n k 2
# 7 q f p 1
# 8 n 8
# 9 n k h 7
# 10 d u l 10
创建数据:
toy <- data.frame(x = sample(letters, 10), y = sample(letters, 10), z = sample(letters, 10), stringsAsFactors = FALSE)
for (col in seq_along(toy)) toy[[col]][sample(10, 3)] <- "Not found"
toy$n <- sample(10)
toy
# x y z n
# 1 m Not found f 6
# 2 z t a 3
# 3 Not found m Not found 4
# 4 Not found j Not found 9
# 5 e Not found Not found 5
# 6 f n k 2
# 7 q f p 1
# 8 Not found Not found n 8
# 9 n k h 7
# 10 d u l 10
答案 1 :(得分:1)
预先写一个简单的函数来做你想做的事情,然后知道如何将这个函数应用到你的所有列中,这通常是有利的。
例如:
replace_notfound <- function(s, newstr="") s[grepl("Not found", s)] <- newstr
现在,让我们将该功能应用于您的数据的每一列:
# I'm assuming you want stringsAsFactors=FALSE
df.cleaned <- as.data.frame(lapply(df, replace_notfound), stringsAsFactors=FALSE)
框架的所有列都不是character
的情况并非总是如此,因此您可能需要有条件地执行此操作:
ischr <- sapply(df, is.character)
df.cleaned <- df # just a copy
df.cleaned[ischr] <- lapply(df.cleaned[ischr], replace_notfound)
答案 2 :(得分:0)
你的想法是正确的。您需要尝试将其应用于每个项目。一种选择可能是使用sapply
。使用str_detect
检查每个项目,并替换为""
或NA
,否则只返回项目的值。
library(stringr)
df.clean <- as.dataframe(sapply(df,
function(x)ifelse(str_detect(x, "Not found"), "",x)))
df.clean
#
# A B
# 1 A Good
# 2 B
# 3 C Good
# 4 D
# 5 E Good
# 6 A
# 7 B Good
# 8 C
# 9 D Good
# 10 E
数据强>
df <- data.frame(A = rep(c("A", "B", "C", "D", "E"), 2),
B = rep(c("Good","Bad with Not found"),5),
stringsAsFactors = FALSE)
df
# A B
# 1 A Good
# 2 B Bad with Not found
# 3 C Good
# 4 D Bad with Not found
# 5 E Good
# 6 A Bad with Not found
# 7 B Good
# 8 C Bad with Not found
# 9 D Good
# 10 E Bad with Not found