【问题标题】:Change value of all strings in column based on condition根据条件更改列中所有字符串的值
【发布时间】:2018-02-06 03:00:17
【问题描述】:

R 的新手,我有一个关于数据清理的问题。

我有一列包含汽车的驱动类型 - 四轮、全轮、两轮等

问题是没有标准化,所以有些行有四轮驱动、四轮驱动、四轮驱动、四轮驱动等

第一步很简单,即将所有内容都大写,但我遇到问题的步骤是将每个值更改为标准,例如 4WD,而无需重新编码每个独特的驱动器。

类似于 For Each 列中的值,如果值 LIKE/CONTAINS "FOUR" 更改为 "4WD"。

我研究了 recode 和 stringdist 和 mutate,但找不到合适的。当我输入它时,听起来我需要一个循环,但不确定确切的语法。

如果解决方案可以与 tidyverse 一起使用,那就太好了!

【问题讨论】:

  • 建议查看match() 以帮助解决此问题。
  • @RobJensen 看起来不错。真的需要一些喜欢/包含的东西,这似乎就是它的作用。我会试试那个

标签: r data-cleaning


【解决方案1】:

欢迎来到 StackOverflow!我已经回答了您的问题,但在未来,请提供一小部分数据样本,以便我们更轻松地解决您的问题。深思:How to make a reproducible example

require(plyr)
require(dplyr)


# Since you haven't provided a data sample, I'm going to assume your dataframe is named "DF" and your column's name is "Drive"

# Set everything to lowercase to pare down uniqueness
DF <- mutate(DF, Drive = replace(Drive, Drive, tolower(Drive)))


# You'll need one line like this for each replacement.  Of the following form:
#     <column_name> = replace(<column_name>, <condition>, <new value>)
DF <- mutate(DF, Drive = replace(Drive, Drive == "4 wheel drive", "4WD"))

【讨论】:

  • 在此列中有大约 45 个唯一值,因此每个值都令人厌烦,并且根据文件的创建方式,可能会有不同的变化未被捕获。想要远离硬编码,这就是为什么我希望它具有 LIKE/CONTAINS 功能。
【解决方案2】:

您可以使用ifelsegrepl。将grepl 的第一个参数更改为与您所需的所有情况相匹配的参数。下面搜索包含“4”或“FOUR”的字符串

df$cleaned_col <- ifelse(grepl('4|four', df$colname_here, ignore.case = T), '4WD', df$colname_here)

如果您想进行多重比较,您可能需要使用 dplyr::case_when 和来自 data.table%like%

require(dplyr);require(data.table)
df %>% mutate(cleaned = case_when(colname %like% 'a|b' ~ "there's an a or b in there"
                                  , colname %like% 'c' ~ "has a c in it"
                                  , T ~ "no a or b or c"))

【讨论】:

  • dplyr 部分是否添加了任何内容?你的主要功能是ifelsegrepl,这就是你所需要的。此外,您可以将all 添加到模式中。
  • @RobJensen 如果我想做多个参数,那么'4 |四' = "4WD", '全轮 | A' = "AWD" 我该怎么做?
  • @RobJensen 这太完美了。正是我需要的。我试过 case_when 但我没有 %like%。非常感谢!许多清洁工作要做:-)
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 2022-07-05
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
相关资源
最近更新 更多