清理数据集中的列R

时间:2018-11-18 03:43:18

标签: r

因此,我得到了带有需要清除的列的数据集。 该列中的对象包含以下内容:“ $ 10,000-$ 19,999 ”,“ $ 40,000及以上”。

我该如何编码,例如,在新列中“ $ 10,000-$ 19,999”变成15000,而“ $ 40,000及以上”变成40000?

我是R的新手,所以我不知道如何开始。我需要对此进行回归分析,但是如果我没有解决这个问题,它将无法正常工作。

有人告诉我,我需要一些基本的字符串/正则表达式操作。我应该如何进行?

2 个答案:

答案 0 :(得分:2)

首先,您应该查看数据的确切组成-使用data $ column上的table()函数查看必须考虑多少个唯一条目。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<li>
    <a href=""></a>
    <ul class="parent">
        <li><a href="">one</a></li>
        <li><a href="">two</a></li>
        <li><a href="">three</a></li>
        <li><a href="">four</a></li>
        <li><a href="">five</a></li>
        <li><a href="">six</a></li>
    </ul>
</li>
<li>
    <a href=""></a>
    <ul class="parent2">
        <li><a href="">one</a></li>
        <li><a href="">two</a></li>
        <li><a href="">three</a></li>
        <li><a href="">four</a></li>
        <li><a href="">five</a></li>
        <li><a href="">six</a></li>
    </ul>
</li>
<div class="all"></div>

如果输入此数据的人员在用词上一致,那么用硬编码代替每个唯一条目可能最容易。因此,如果unique(data $ column)[1] ==“ $ 10,000-$ 19,999”,而unique(data $ column)[2] ==“ $ 40,000以上”。

table(data$column) 

如果您无法通过太多独特的条目来实现此方法,我建议您在字符序列中寻找可用于替换的一致性。如果您发现输入此数据的人与他们如何写“ 40,000美元及以上”不一致,那么您将:

data$column[which(data$column==unique(data$column)[1])] <- "15000"
data$column[which(data$column==unique(data$column)[2])] <- "40000"
...

如果不存在属于其他类别的“ $ 40,000”实例,则可以组合这些条目以替换la:

data$column==unique(data$column)[2]
>"$40,000 and over."
data$column==unique(data$column)[3]
>"$40,000 and over"
data$column==unique(data$column)[4]
>"above $40,000"
...

定性数据输入不一致是一个非常人性化的问题,需要探索您的数据以寻找趋势以及合并替代品的简便方法。我认为使用R来识别和替换您发现的模式以节省时间是一个好主意,但是最终您需要精打细算,因为您不得不理解/纠正某个人的条目以将其包括在自己的案例中。所需的垃圾箱。根据您的数据质量标准,您总是可以丢弃这些似乎不符合您观察到的模式的条目。

答案 1 :(得分:1)

这是使用tidyverse的解决方案。

加载程序包

library(dplyr) # for general cleaning functions
library(stringr) # for string manipulations
library(magrittr) # for the '%<>% function

根据您的示例创建虚拟数据集。

df <- data_frame(price = sample(c(rep('$40,000 and over', 10), 
                                  rep('$10,000', 10),
                                  rep('$19,999', 10),
                                  rep('$9,000', 10),
                                  rep('$28,000', 10))))

检查新数据框

print(df)
#> # A tibble: 50 x 1
#>    price           
#>    <chr>           
#>  1 $9,000          
#>  2 $40,000 and over
#>  3 $28,000         
#>  4 $10,000         
#>  5 $10,000         
#>  6 $9,000          
#>  7 $19,999         
#>  8 $10,000         
#>  9 $19,999         
#> 10 $40,000 and over
#> # ... with 40 more rows

通过删除$符号和,清理价格字符串的格式。请注意在'\\'符号前使用$。在R中使用这种格式来转义特殊字符(第二个\是标准的正则表达式转义开关,第一个\告诉R来转义第二个\)。

df %<>% 
    mutate(price = str_remove(string = price, pattern = '\\$'), # remove $ sign
           price = str_remove(string = price, pattern = ',')) # remove comma

快速检查数据。

head(df)
#> # A tibble: 6 x 1
#>   price         
#>   <chr>         
#> 1 9000          
#> 2 40000 and over
#> 3 28000         
#> 4 10000         
#> 5 10000         
#> 6 9000

将数字字符串处理为数字。首先将40000 and over转换为40000,然后将所有字符串转换为数字,然后使用逻辑语句将数字转换为所需的值。函数ifelse()case_when()是可以互换的,但是我倾向于将ifelse()用于单个规则,而当存在多个规则时,我倾向于使用case_when(),因为{的格式更紧凑{1}}。

case_when()

最后看看。

df %<>%
    mutate(price = ifelse(price == '40000 and over', # convert 40000+ to 40000
                          yes = '40000',
                          no = price),
           price = as.numeric(price), # convert all to numeric
           price = case_when( # use logic statements to change values to desired value
               price == 40000 ~ 40000,
               price >= 30000 & price < 40000 ~ 35000,
               price >= 20000 & price < 30000 ~ 25000,
               price >= 10000 & price < 20000 ~ 15000,
               price >= 0 & price < 10000 ~ 5000
           ))

reprex package(v0.2.1)于2018-11-18创建