首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据元素的内容删除元素?

根据元素的内容删除元素?
EN

Stack Overflow用户
提问于 2018-03-20 20:54:27
回答 3查看 59关注 0票数 1
代码语言:javascript
复制
df.cleaned <- df[-which(str_detect(df, "Not found")),]

"df“指由多列和多行组成的数据框架。这个数据框架中的许多元素中都有特定的字符词。

我想要做的是,删除所有包含单词"Not“的值,或者作为整个元素值,或者作为元素值的一部分。

到目前为止,上面的命令就是我提出的字符串包。但是,该命令似乎删除了整行。我不想删除整个行,我只想删除包含“contains”的特定元素。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-20 21:39:36

你的想法是正确的。您需要尝试将其应用于每一项。一种选择是使用sapply。用str_detect检查每一项,用""NA替换,否则只返回项的值。

代码语言:javascript
复制
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   

数据

代码语言:javascript
复制
    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
票数 0
EN

Stack Overflow用户

发布于 2018-03-20 21:11:32

如何获得行为:

代码语言:javascript
复制
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在评论中解释的那样,同样的转换是在幕后完成的。在这种情况下,它看起来不像相等的解决方案那么干净,但是不应该因为转换而降低性能:

代码语言:javascript
复制
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

创建数据:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-03-20 21:15:49

预先编写一个简单的函数来实现您想要的功能,然后知道如何将该函数应用到所有的列中,这通常是有利的。

例如:

代码语言:javascript
复制
replace_notfound <- function(s, newstr="") s[grepl("Not found", s)] <- newstr

现在,让我们将该函数应用于数据的每一列:

代码语言:javascript
复制
# I'm assuming you want stringsAsFactors=FALSE
df.cleaned <- as.data.frame(lapply(df, replace_notfound), stringsAsFactors=FALSE)

并不总是框架的所有列都是character,因此您可能需要有条件地这样做:

代码语言:javascript
复制
ischr <- sapply(df, is.character)
df.cleaned <- df # just a copy
df.cleaned[ischr] <- lapply(df.cleaned[ischr], replace_notfound)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49393936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档