根据内容删除元素?

时间:2018-03-20 20:54:28

标签: r

df.cleaned <- df[-which(str_detect(df, "Not found")),]

&#34; DF&#34;是指由多个列和行组成的数据框。此数据框中的许多元素都包含某些字符单词。

我要做的是删除所有包含单词&#34; Not found&#34;要么作为整个元素值,要么作为其中的一部分。

到目前为止,上面的命令是我提出的,使用stringr包。但是,此命令似乎删除整行。我不想删除整行,我只想删除包含&#34;未找到&#34;的特定元素。

3 个答案:

答案 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