根据条件更改列中所有字符串的值

时间:2018-02-05 18:31:25

标签: r data-cleaning

New-ish to R,我对数据清理有疑问。

我有一个列,其中包含汽车的驱动类型 - 四轮,全轮,两轮等

问题是没有标准化,所以有些行有4个WHEEL驱动器,4wd,4WD,四轮驱动器等等。

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

类似于列中的每个值,如果值LIKE / CONTAINS“FOUR”更改为“4WD”。

我研究过recode和stringdist并且变异但我找不到合适的东西。当我输入它时听起来我需要一个循环但不确定确切的语法。

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

2 个答案:

答案 0 :(得分:2)

欢迎使用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"))

答案 1 :(得分: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使用%like%来自data.table

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"))