我想跨多列重新编码大量变量。这是一个示例 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..1
是across(abc1:abc4, ~recode(.x, `501:508` = 91L, `509` = 92L, `510` = 93L))
由 coercionProblem 引入的 .NAs 和mutate()
input ..1
。x 未替换的值被视为 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] 删除。
我来说两句