首页 > 解决方案 > 清理调查数据,需要为 100 的响应创建新变量,有没有快速的方法?

问题描述

我有维生素列,人们可以在其中勾选他们服用的维生素(钙、维生素 D)等。还有一个“其他”列用于未包括在内的维生素,人们可以在其中写下他们服用的东西(例如“我服用一种复合维生素”或“我服用 B12 和一种复合维生素”)有 631 个条目,我想知道是否有一种快速的方法来清理这个?例如,有没有办法自动获取所有“多种维生素”条目并将它们记录为“多种维生素”列中的“是”?

更好的是,有一种方法可以自动读取另一列,将它们添加到该 ID 的现有列中(例如,人 'eee' 输入了 'calcium',但有一个用于钙的刻度选项,所以我希望记录他们的响应在钙柱中)如果没有柱(例如复合维生素没有柱),那么创建一个新柱并为那个人添加它?

It currently looks like this: 

   ID VitD Calcium FishOil                 Other
1 aaa <NA>    <NA>    <NA>                  <NA>
2 bbb <NA>     yes    <NA>                  <NA>
3 ccc <NA>     yes    <NA> I take a multivitamin
4 ddd  yes    <NA>     yes         Multi vitamin
5 eee  yes    <NA>    <NA> Calcium and vitamin C
6 fff <NA>     yes     yes      evening primrose 

我用这段代码来制作它:

structure(list(ID = c("aaa", "bbb", "ccc", "ddd", "eee", "fff"), VitD = c(NA, NA, NA, "yes", "yes", NA),  Calcium = c(NA,"yes", "yes", NA, NA, "yes"), 
FishOil= c(NA, NA, NA, "yes", NA, "yes"), Other= c(NA, NA, "I take a multivitamin", "Multi vitamin", "Calcium and vitamin C", "evening primrose")),
class = "data.frame", row.names = c(NA,-6L))
                                           

我希望它看起来像这样:

       ID VitD Calcium FishOil multivit VitC Eveprim Other
1 aaa <NA>    <NA>    <NA>     <NA> <NA>    <NA>    NA
2 bbb <NA>     yes    <NA>     <NA> <NA>    <NA>    NA
3 ccc <NA>     yes    <NA>      yes <NA>    <NA>    NA
4 ddd  yes    <NA>     yes      yes <NA>    <NA>    NA
5 eee  yes     yes    <NA>     <NA>  yes    <NA>    NA
6 fff <NA>     yes     yes     <NA> <NA>     yes    NA

我使用了这段代码:

structure(list(ID = c("aaa", "bbb", "ccc", "ddd", "eee", "fff"), VitD = c(NA, NA, NA, "yes", "yes", NA),  Calcium = c(NA,"yes", "yes", NA, "yes", "yes"), 
               FishOil= c(NA, NA, NA, "yes", NA, "yes"), multivit=c(NA, NA, "yes", "yes", NA, NA), VitC=c(NA, NA, NA, NA, "yes", NA), Eveprim=c(NA, NA, NA, NA,NA, "yes"),  Other= c(NA, NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA,-6L))

目前我手动完成,但这需要很长时间:

#Add a vit c column 
survey$vit_C <- rep("1", length(survey$vit_d))
survey$vit_C <- na_if(survey$vit_C, "1")
#variable for the text column words to recode
vitaminC <- c("vitC")
#recode the words
survey <- survey %>%
  mutate(vit_C = if_else(bc_text %in% vitaminC, "vitamin C", vit_C),
         vit_text = if_else(vit_text %in% vit_C, NA_character_, vit_text))

标签: automationtext-miningdata-cleaningdata-wrangling

解决方案


推荐阅读