因此,我得到了带有需要清除的列的数据集。 该列中的对象包含以下内容:“ $ 10,000-$ 19,999 ”,“ $ 40,000及以上”。
我该如何编码,例如,在新列中“ $ 10,000-$ 19,999”变成15000,而“ $ 40,000及以上”变成40000?
我是R的新手,所以我不知道如何开始。我需要对此进行回归分析,但是如果我没有解决这个问题,它将无法正常工作。
有人告诉我,我需要一些基本的字符串/正则表达式操作。我应该如何进行?
答案 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创建