用R语言用数字替换各种填答题的最佳方法

qaxu7uf2  于 12个月前  发布在  R语言
关注(0)|答案(1)|浏览(137)

我正在使用R来清理数据集。我的数据集的一部分看起来像:

record_id | organization | other_work_loc
1               12            CCC
2               12            AMG
3               12            TAO
4                1
5                2
6                7

other_work_loc是一个自由响应列,其中包含高度可变的条目。只有当organization = 12时才有数据。我想将organization和other_work_loc数据重新分类到一个列(org_cat)中,其中包含三个类别(1、2、3)。大多数other_work_loc数据将被重新分类为“3”。

dataset<- dataset %>% mutate(org_cat = case_when (organization == 1 | organization == 2 ~ '1',
                                                            organization >= 3 & organization <12 ~ '2',
                                                            other_work_loc == 'CCC' | other_work_loc == AMG ~ '3'))

这段代码可以工作,但是在'other_work_loc'中有100个自由响应。大多数将被重新分类为'3'。然而,22个需要被分类为'1'或'2',我想知道是否有比写出如何重新编码每个单独响应更优雅的方法?

t1rydlwq

t1rydlwq1#

使用Excel或类似工具创建一个包含organizationother_work_locnewvar列的数据框,其中最后两个是您的自由回答及其相应的数字替换值-基本上是一个查找表。我把我的命名为lut.csv,它看起来像这样:

organization    other_work_loc  newvar
12              CCC             3
12              AMG             3
12              TAO             2
1                               1

我将你的dataframe命名为df.csv,在加载tidyverse后,使用left_join执行替换:

df <- read_csv('df.csv') %>% print()
lut <- read_csv('lut.csv') %>% print()

left_join(df, lut)

Joining with `by = join_by(organization, other_work_loc)`
# A tibble: 6 x 4
  record_id organization other_work_loc newvar
      <dbl>        <dbl> <chr>           <dbl>
1         1           12 CCC                 3
2         2           12 AMG                 3
3         3           12 TAO                 2
4         4            1 NA                  1
5         5            2 NA                 NA
6         6            7 NA                 NA

要点:

  • 即使我在组织#1的LUT中保留了other_work_loc空白,它仍然能够成功地匹配到原始文件的那一行,只是基于organization
  • 我没有填写整个LUT,所以组织#2和#7最终对newvar使用NA。
  • 对于组织#12,您可以更容易地编辑LUT文件以添加额外的自由响应及其相应的newvar条目,而不是编写额外的case_when代码行。

相关问题