При перекодировании значений числовых переменных, таких как var1 ниже, в символьные значения, иногда есть легкая скороговорка. Например, предположим, что числовые значения 1:4 в var1 необходимо перекодировать как LETTERS[27-(4:1)] соответственно.

Можно ли в таких ситуациях избежать записи var1 = recode(var1, 1 ="W", 2 ="X", 3 ="Y", 4 ="Z") и вместо этого зациклить перекодирование?

library(tidyverse)

(dat <- data.frame(var1 = rep(1:4,2), id = 1:8))

mutate(dat, var1 = recode(var1,`1`="W",`2`="X",`3`="Y",`4`="Z")) # This works but can we 
                                                                 # loop it as well?
0
Simon Harmel 18 Сен 2021 в 04:30

2 ответа

Лучший ответ

Мы можем использовать векторизованный подход, никаких циклов не требуется. tail и базовое подмножество с [ помогут здесь.

library(dplyr)

dat %>% mutate(var1=tail(LETTERS, max(var1))[var1] %>% as.factor)
  var1 id
1    W  1
2    X  2
3    Y  3
4    Z  4
5    W  5
6    X  6
7    Y  7
8    Z  8

данные

dat <- data.frame(var1 = rep(1:4,2), id = 1:8)

< Сильный > data2

dat2 <- data.frame(var1 = c(2,1,3,1,4:1), id = 1:8))

  var1 id
1    2  1
2    1  2
3    3  3
4    1  4
5    4  5
6    3  6
7    2  7
8    1  8

< Сильный > output2

  var1 id
1    X  1
2    W  2
3    Y  3
4    W  4
5    Z  5
6    Y  6
7    X  7
8    W  8
1
GuedesBF 18 Сен 2021 в 02:27

Ты можешь использовать -

library(dplyr)

dat %>% mutate(var1 = LETTERS[length(LETTERS)-max(var1) + var1])

#  var1 id
#1    W  1
#2    X  2
#3    Y  3
#4    Z  4
#5    W  5
#6    X  6
#7    Y  7
#8    Z  8
0
Ronak Shah 18 Сен 2021 в 02:55