0

我有一堆变量,其中有这些替代文本答案。其中一些替代答案对应于多项选择中的答案,所以我要做的就是将这些值重新编码回数字格式。我做了一个有效的代码:

s1 <- s1 %>%
  mutate(s1_auto1_eigendom = coalesce(case_when(
    s1_auto1_eigendom_anderstext == 'alleen ik' ~ 1,
    s1_auto1_eigendom_anderstext == 'Alleen van mij' ~ 1,
    s1_auto1_eigendom_anderstext == 'echtpaar' ~ 1,
    s1_auto1_eigendom_anderstext == 'eigen auto' ~ 1,
    s1_auto1_eigendom_anderstext == 'lease auto partner via zijn werkgever' ~ 2,
    s1_auto1_eigendom_anderstext == 'Lease auto van mijn partner' ~ 3,
    s1_auto1_eigendom_anderstext == 'mij' ~ 1,
    s1_auto1_eigendom_anderstext == 'Mij' ~ 1,
    s1_auto1_eigendom_anderstext == 'mij zelf' ~ 1,
    s1_auto1_eigendom_anderstext == 'Mijn eigen auto' ~ 1,
    s1_auto1_eigendom_anderstext == 'mijzelf' ~ 1,
    s1_auto1_eigendom_anderstext == 'Mijzelf' ~ 1,
    s1_auto1_eigendom_anderstext == 'van 1e pers.' ~ 1,
    s1_auto1_eigendom_anderstext == 'van mij' ~ 1,
    s1_auto1_eigendom_anderstext == 'Van mij' ~ 1,
    s1_auto1_eigendom_anderstext == 'van mij alleen' ~ 1,
    s1_auto1_eigendom_anderstext == 'Van mij alleen' ~ 1,
    s1_auto1_eigendom_anderstext == 'van mij alleen.' ~ 1,
    s1_auto1_eigendom_anderstext == 'van mij dus' ~ 1,
    s1_auto1_eigendom_anderstext == 'van mij en 1 lid van mijn huishouden' ~ 1,
    s1_auto1_eigendom_anderstext == 'van mijzelf' ~ 1,
    s1_auto1_eigendom_anderstext == 'Van mijzelf' ~ 1,
    s1_auto1_eigendom_anderstext == 'van ons samen' ~ 1,
    s1_auto1_eigendom_anderstext == 'Van ons samen ' ~ 1), s1_auto1_eigendom))
s1 <- s1 %>%
  mutate(s1_auto1_eigendom_anderstext = case_when(s1_auto1_eigendom != 7 ~ NA))

但是我还有 8 个变量,我必须为这些变量做同样的事情。我也必须为 s1_auto2_eigendom、s1_auto3_eigendom、... s1_auto8_eigendom 做同样的事情,所以我想我会通过创建一个函数来压缩它。

我试过这个:

recode_s1_autox_eigendom <- function(x,y) {
  mutate(x = coalesce(case_when(
      y == 'alleen ik' ~ 1,
      y == 'Alleen van mij' ~ 1,
      y == 'echtpaar' ~ 1,
      y == 'eigen auto' ~ 1,
      y == 'lease auto partner via zijn werkgever' ~ 2,
      y == 'Lease auto van mijn partner' ~ 3,
      y == 'mij' ~ 1,
      y == 'Mij' ~ 1,
      y == 'mij zelf' ~ 1,
      y == 'Mijn eigen auto' ~ 1,
      y == 'mijzelf' ~ 1,
      y == 'Mijzelf' ~ 1,
      y == 'van 1e pers.' ~ 1,
      y == 'van mij' ~ 1,
      y == 'Van mij' ~ 1,
      y == 'van mij alleen' ~ 1,
      y == 'Van mij alleen' ~ 1,
      y == 'van mij alleen.' ~ 1,
      y == 'van mij dus' ~ 1,
      y == 'van mij en 1 lid van mijn huishouden' ~ 1,
      y == 'van mijzelf' ~ 1,
      y == 'Van mijzelf' ~ 1,
      y == 'van ons samen' ~ 1,
      y == 'Van ons samen ' ~ 1), x))
  mutate(y = case_when(x != 7 ~ NA))
}
s1 <- recode_s1_autox_eigendom(s1$s1_auto1_eigendom,s1$s1_auto1_eigendom_anderstext)

但是当我这样做时,什么也没有发生。没有错误,但我没有得到任何结果。我首先尝试使用管道选项,然后尝试在函数内的代码前面使用 s1 <- ,但这也不起作用。

为了稍微解释一下数据,s1_auto1_eigendom 取值 1-7,7 表示“anders”,对于许多答案 7,s1_auto1_eigendom_anderstext 中会有一个文本条目,其中一些文本条目对应于 7 以外的其他值。

例子:

col1     col2     col3     col4 ....
1                 1
2                 4
7       "mij"     5        
3               
4                 4
7       "mijzelf" 7        "mij"
7       "other" 
7       "other"   7        "other"

col1     col2     col3     col4 ....
1                 1
2                 4
1                 5        
3               
4                 4
1                 1        
7       "other" 
7       "smthng"  7        "other"
4

1 回答 1

0

当您比较多个值时,请使用%in%而不是==.

例如 -

而不是这样做 -

library(dplyr)

x <- 1:4

case_when(x == 1 ~ '1', 
          x == 2 ~ '1', 
          x == 3 ~ '2')

#[1] "1" "1" "2" NA 

做这个 -

case_when(x %in% c(1, 2) ~ '1',
          x == 3 ~ '2')
#[1] "1" "1" "2" NA 

其次,用于across将函数应用于多个列。

fun <- function(x) {
  case_when(x %in% c(1, 2) ~ '1',
            x == 3 ~ '2')
}

df <- data.frame(a = 1:4, b = 4:1)

df %>% mutate(across(c(a, b), fun))

#     a    b
#1    1 <NA>
#2    1    2
#3    2    1
#4 <NA>    1
于 2022-02-28T11:52:59.080 回答