【问题标题】:changing all values in one column in a filtered data.frame in R更改R中过滤的data.frame中一列中的所有值
【发布时间】:2019-05-21 20:47:10
【问题描述】:

我有一个非常混乱的数据框,其中一列的值是人类可以理解但计算机无法理解的,有点像下面的那个。

df<-data.frame("id"=c(1:10), 
           "colour"=c("re d", ", red", "re-d","green", "gre, en", ", gre-en",  "blu e", "green", ", blue", "bl ue"))

我可以用str_detect过滤df

df %>% filter(str_detect(tolower(colour), pattern = "gr")) 

但我想将所有过滤后的结果重命名为相同的值,以便对其进行处理。
有什么建议吗?
我试图用模式分开,但没有成功。

编辑:不是全部。我正在使用的 df 中不需要空格。可以说,在组成的 df 中写绿色的正确方法是“gr.een”。

EDIT2:
想要的结果是伪造的颜色拼写只是为了得到一个想法:

id     colour
1      r. ed
2      r. ed
3      r. ed
4      gr. een
6      gr. een
7      gr. een
8      blu. e
9      gr. een           
10     blu. e

【问题讨论】:

  • 为什么不(预先)处理colour 列并在过滤之前将其更新为有意义的内容?试试这个df$colour = gsub("[^[:alnum:] ]", "", df$colour); df$colour = gsub(" ", "", df$colour),它将删除所有非字母数字值和空格。
  • df %&gt;% mutate(colour2 = gsub("[^a-zA-Z]", "", colour))
  • ...还请注意,(a)对于本示例,您不需要 tolower,(b)您使用的模式不会选择像 g-reen 或 @987654330 这样的值@。这就是为什么我建议您在过滤之前对您的列进行预处理。
  • @AntoniosK 在我使用的 df 中,并非所有非字母数字值和空格都是不必要的。不幸的是。
  • 那么我想你可以尽可能多地预处理数据。关于您上面的问题,您想为过滤结果分配什么值? gr. een?

标签: r dplyr stringr


【解决方案1】:

您可以使用mgsub 将多个单词替换为多个模式:

df<-data.frame("id"=c(1:10), 
               "colour"=c("re d", ", red", "re-d","green", "gre, en", 
                          ", gre-en",  "blu e", "green", ", blue", "bl ue"))

library(textclean)

df$colour = mgsub(df$colour, 
                  pattern =  c(".*gr.*", ".*re.*", ".*bl.*"), 
                  replacement =  c("gr. een", "r. ed", "blu. e"), fixed = F)

df

#     id  colour
# 1   1   r. ed
# 2   2   r. ed
# 3   3   r. ed
# 4   4 gr. een
# 5   5 gr. een
# 6   6 gr. een
# 7   7  blu. e
# 8   8 gr. een
# 9   9  blu. e
# 10 10  blu. e

【讨论】:

  • 谢谢。我似乎没有让FilterAndUpdatecode 工作(我将 d 更改为 df - 因为我认为这是问题,但它仍然没有工作)。正如我认为您理解的那样,我需要保存更改,以便我可以返回原始 df 并使用多种组合进行操作,然后再将其绘制出来。
  • 不,您提到过滤时不清楚。如果您需要根据某些模式更新列,则无需过滤任何内容。您只需使用一个函数更新原始数据集中的列,该函数使用具有多个值的向量作为模式和具有多个替换的向量。
  • 在您发布的示例中,您似乎只想更新过滤结果而不是原始数据集。您必须发布您的预期输出以避免任何混淆。
  • 感谢您的帮助,我已经用我想要的表格编辑了问题。如果有任何其他更改可以澄清,请随时告诉我。
  • 耶!谢谢。
【解决方案2】:

这里有两种预处理数据的解决方案,一种在 cmets 中已经给出:

library(dplyr)
df %>% 
  mutate(colour2 = gsub("[^A-z]", "", colour))%>%
  filter(str_detect(tolower(colour2), pattern = "green")) 

逆向思考,可以使用stringr提取字母

library(stringr)

df %>% 
  mutate(colour2 = sapply(str_extract_all(df$colour,"[A-z]"),function(vec){paste0(vec,collapse = "")}))%>%
  filter(str_detect(tolower(colour2), pattern = "green")) 

您的选择将更加可靠,并且该列已重命名。

  id   colour colour2
1  4    green   green
2  5  gre, en   green
3  6 , gre-en   green
4  8    green   green

【讨论】:

  • 谢谢。我需要保留一些空格和 .让我们假设绿色应该写成 Gr。恩
【解决方案3】:

如果您只想重命名所有过滤后的结果,如何:

df<-data.frame("id"=c(1:10), 
               "colour"=c("re d", ", red", "re-d","green", "gre, en", ", gre-en",  "blu e", "green", ", blue", "bl ue"))

library(stringr)                                                         
df[str_detect(tolower(df[,"colour"]), pattern = "gr"), "colour"] <- "green"

【讨论】:

  • hm...当我运行该代码时,不仅列“颜色”更改,id 4:6, 8 也更改为绿色....
  • @Mactilda 哈哈,是的,我的代码中有愚蠢的错字。我会修复
  • @Mactilda 现已修复,代码中缺少colour 列的名称。
  • 沮丧!它与我制作的 df 完美配合 - 但改变了我真实 df 中的整个列。感谢您的帮助。
猜你喜欢
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
相关资源
最近更新 更多