【问题标题】:Renaming Column Values Efficiently [closed]有效地重命名列值[关闭]
【发布时间】:2019-05-18 05:41:27
【问题描述】:

我正在尝试一次重命名数据中的值,而不是逐项进行。

现在我正在使用此代码来执行我的更改:

INV$Classification[INV$Classification=="lay net"] <- "Illegal Lay Net"

我的数据是 INV,我的列是分类。我想找到“lay net”一词的所有实例并将它们替换为“Illegal Lay Net”。我现在正在手动执行此操作,我最终可以在 excel 中执行此操作。有没有更有效的方法来做到这一点?

例如,我有以下条目:POSSIBLE ILLEGAL LAY NET 或 Lay Nets Violation,仅使用“lay net”查找无法获取这些条目,因此不会切换,因为此代码非常具体。

【问题讨论】:

  • 您要使用什么软件?这听起来像是一个简单的查找和替换,Knuth-Morris-Pratt algorithm 非常擅长(用于查找匹配项)。替换文本将非常依赖于您使用的技术(使用 Ctrl+F 并使用 Excel 中的替换选项 - 如果那是您的平台,那么这个问题属于 SuperUser 并且绝对是重复的)。
  • 我正在使用 RStudio,我希望它是一个非常简单的查找和替换,但没有找到任何似乎可以工作的代码。
  • 拜托,你需要用高度相关的东西来标记你的帖子。
  • 看起来您也可能遇到区分大小写的问题(即“AbcD”与“aBCd”的处理方式不同)。您通常可以通过将字符串先搜索大写或小写函数来解决此问题,例如,如果您要搜索“abcd”,则执行UPPER(MyVariable).Contains(UPPER(MySearch))(伪代码)。
  • 对不起,这是我第一次发帖。我不确定我是否理解,这与在 stringr 中创建字符串是分开的吗?

标签: r rstudio data-manipulation data-cleaning renaming


【解决方案1】:

您想开始使用正则表达式。看看gsubgrepgrepl 和类似的功能。当然,这不是灵丹妙药,您仍然必须了解并确保抓住每一个案例。

这是一个例子,可以捕捉到你所说的 3 种情况:

INV$Classification[grepl("lay net", INV$Classification, ignore.case=T)] <- "Illegal Lay Net"

【讨论】:

  • 这太棒了!谢谢!比一次做一个要快得多
【解决方案2】:

这是一个使用 stringr 的详细 tidyverse 解决方案,首先转换为小写,然后测试其中是否包含“lay net”,如果包含则替换为新字符串。

library(tidyverse)
INV <- INV %>% 
  mutate(Classification = if_else(Classification %>% 
                                  tolower %>% 
                                  str_detect("lay net"),
                                  "Illegal Lay Net", Classification)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 2015-11-17
    相关资源
    最近更新 更多