Използване на plyr::mapvalues ​​с dplyr

plyr::mapvalues може да се използва така:

mapvalues(mtcars$cyl, c(4, 6, 8), c("a", "b", "c"))

Но това не работи:

mtcars %>%
dplyr::select(cyl) %>%
mapvalues(c(4, 6, 8), c("a", "b", "c")) %>%
as.data.frame()

Как мога да използвам plyr::mapvalues с dplyr? Или още по-добре, какъв е еквивалентът на dplyr?


person luciano    schedule 18.01.2015    source източник
comment
Опитайте mtcars %>% select(cyl) %>% .$cyl %>% plyr::mapvalues(c(4,6,8), c('a', 'b', 'c'))%>% as.data.frame()   -  person akrun    schedule 18.01.2015
comment
Това работи. Какво прави .$cyl?   -  person luciano    schedule 18.01.2015
comment
@luciano Получава cyl като вектор. Обикновено синтаксисът в dplyr е да се приложи функцията вътре в mutate (както показа Ричард Скривън), но аз просто имитирах вашия код   -  person akrun    schedule 18.01.2015
comment
Току-що забелязах, че преименува cyl на . Така че това решение само донякъде работи.   -  person luciano    schedule 18.01.2015
comment
Можете да използвате mtcars %>% transmute(cyl = factor(cyl, labels = c("a", "b", "c"))) по подобен начин   -  person talat    schedule 18.01.2015
comment
@luciano Можете да промените предишния код на mtcars %>% .$cyl %>% plyr::mapvalues(c(4,6,8), c('a', 'b', 'c')) %>% data.frame(cyl=.)   -  person akrun    schedule 18.01.2015


Отговори (3)


Актуализация от 2020 г.: plyr вече е оттеглен пакет и неговите официални насоки предлагат вместо това да се използва активно подобреният и поддържан пакет dplyr. Така че е за предпочитане да използвате само dplyr, в този случай dplyr::recode() както в друг отговор, и да избягвате plyr изцяло.

За да използвате plyr::mapvalues() с dplyr:

За да го използвате и да върнете data.frame с една колона:

mtcars %>%
  transmute(cyl = plyr::mapvalues(cyl, c(4, 6, 8), c("a", "b", "c")))

Или ако искате един векторен изход, както във вашия работен пример, използвайте pull:

mtcars %>%
  pull(cyl) %>%
  plyr::mapvalues(., c(4, 6, 8), c("a", "b", "c"))

Ако използвате dplyr и plyr едновременно, вижте тази бележка от dplyr readme:

Ще трябва да бъдете малко внимателни, ако зареждате едновременно plyr и dplyr. Бих препоръчал първо да заредите plyr, след това dplyr, така че по-бързите dplyr функции да са първи в пътя за търсене. Като цяло всяка функция, осигурена от dplyr и plyr, работи по подобен начин, въпреки че функциите на dplyr обикновено са по-бързи и по-общи.

Имайте предвид обаче, че можете да извикате mapvalues с помощта на plyr::mapvalues, ако dplyr е зареден, без да е необходимо да зареждате plyr.

person Sam Firke    schedule 02.06.2015

Както се споменава и във въпросите

Или още по-добре, какъв е еквивалентът на dplyr?

Еквивалентът е recode.

http://www.cookbook-r.com/Manipulating_data/Renaming_levels_of_a_factor/

name <- c("John", "Clara", "Smith")
sex <- c(1,2,1)
age <- c(30,32,54)
df <- data.frame(name,sex,age)
df %>% mutate(sex=recode(sex,
`1`="Male",
`2`="Female"))

Това ще "съпостави стойности" 1 към мъжки и 2 към женски.

person Yash    schedule 06.01.2020

Бях тежък потребител на plyr::mapvalues(). Използвах го за замяна на стари стойности в низове с нови. Нещо като:

set.seed(1)
data <- data.frame(name = sample(letters[1:5], 100, replace = TRUE))
check_list <- data.frame(old = letters[1:5], new = LETTERS[1:5])

data$name
#> [1] "a" "d" "a" "b" "e" "c" "b" "c" "c" "a" "e" "e" "b" "b"

plyr::mapvalues(data$name, check_list$old, check_list$new)
#> [1] "A" "D" "A" "B" "E" "C" "B" "C" "C" "A" "E" "E" "B" "B" ...

Моля, поправете ме, ако греша, но няма също толкова кратък и подреден dplyr начин да направите това. Все още можете да го направите с dplyr::recode() обаче:

dplyr::recode(data$name, !!!setNames(check_list$new, check_list$old))
#> [1] "A" "D" "A" "B" "E" "C" "B" "C" "C" "A" "E" "E" "B" "B" ...

Както се казва в документацията, редът за посочения вектор е стар (име) = ново (стойност), което е обратното на функциите dplyr::mutate() и dplyr::rename() (при запис може да е коригирано по-късно).

Добавям това като отговор, защото продължавам да търся в Гугъл как да го направя, когато забравя и не мога да намеря отговора бързо. Може би сега мога. Решението е модифицирано от последните два реда на Примери в документацията на функцията.

person Mikko    schedule 10.06.2021