df.cleaned <- df[-which(str_detect(df, "Not found")),]"df“指由多列和多行组成的数据框架。这个数据框架中的许多元素中都有特定的字符词。
我想要做的是,删除所有包含单词"Not“的值,或者作为整个元素值,或者作为元素值的一部分。
到目前为止,上面的命令就是我提出的字符串包。但是,该命令似乎删除了整行。我不想删除整个行,我只想删除包含“contains”的特定元素。
发布于 2018-03-20 21:39:36
你的想法是正确的。您需要尝试将其应用于每一项。一种选择是使用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发布于 2018-03-20 21:11:32
如何获得行为:
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发布于 2018-03-20 21:15:49
预先编写一个简单的函数来实现您想要的功能,然后知道如何将该函数应用到所有的列中,这通常是有利的。
例如:
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)https://stackoverflow.com/questions/49393936
复制相似问题