选择大范围的值以在 R 中重新编码

赖斯

我想跨多列重新编码大量变量。这是一个示例 df

df <- data.frame(
  id_number = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
  age = c(10, 11, 12, 13, 14, 15, 16, 17, 18, 19),
  abc1 = c(501, 502, 503, 504, 505, 506, 507, 508, 509, 510),
  abc2 = c(501, 502, 501, 501, 502, 501, 502, 503, 501, 502),
  abc3 = c(501, 506, 501, 501, 510, 501, 510, 501, 501, 501),
  abc4 = c(507, 505, 501, 501, 501, 501, 501, 501, 501, 501)
)

df

列 abc1:abc4 的值是 501:510,我试图一次将所有这些列中的 501:508 重新编码为 91,将 509 重新编码为 92,将 510 重新编码为 93。这是我尝试过的-

library(dplyr)
df1 <- 
  df %>%
  mutate(across(
    abc1:abc4,
    ~ recode(
      .x,
      `501:508` = 91L,
      `509` = 92L,
      `510` = 93L
          )
  ))

但我收到一个错误

x 由 coercion 引入的 NAs ℹ Input..1across(abc1:abc4, ~recode(.x, `501:508` = 91L, `509` = 92L, `510` = 93L))由 coercionProblem 引入的 .NAs 和mutate()input ..1x 未替换的值被视为 NA 作为 .x 是不兼容的。请详尽地指定替代品或提供 .default

但是,如果我一个一个地更改值,但我想一次完成所有操作,因为我的真实数据有很长的值列表,它会起作用。我是不是做错了部分

`501:508` = 91L,

谢谢 !

阿克伦

一个更简单的选择是匹配一个命名向量

library(dplyr)
nm1 <- setNames(rep(c(91, 92, 93), c(8, 1, 1)), 501:510)
df1 <- df %>%
     mutate(across(abc1:abc4, ~  nm1[as.character(.x)]))

-输出

df1
   id_number age abc1 abc2 abc3 abc4
1          1  10   91   91   91   91
2          2  11   91   91   91   91
3          3  12   91   91   91   91
4          4  13   91   91   91   91
5          5  14   91   91   93   91
6          6  15   91   91   91   91
7          7  16   91   91   93   91
8          8  17   91   91   91   91
9          9  18   92   91   91   91
10        10  19   93   91   91   91

命名向量的使用recode也适用

df %>% 
   mutate(across(abc1:abc4, ~ recode(., !!!  nm1)))

-输出

 id_number age abc1 abc2 abc3 abc4
1          1  10   91   91   91   91
2          2  11   91   91   91   91
3          3  12   91   91   91   91
4          4  13   91   91   91   91
5          5  14   91   91   93   91
6          6  15   91   91   91   91
7          7  16   91   91   93   91
8          8  17   91   91   91   91
9          9  18   92   91   91   91
10        10  19   93   91   91   91

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章