web-dev-qa-db-ja.com

dplyrでplyr :: mapvaluesを使用する

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 with dplyr?またはさらに良いことに、dplyrに相当するものは何ですか?

14
luciano

これを使用して1列の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関数はより高速で一般的である傾向があります。

ただし、plyrをロードせずにdplyrをロードした場合は、plyr::mapvaluesを使用してmapvaluesを呼び出すことができます。

16
Sam Firke

質問にも言及されているように

またはさらに良いことに、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が女性に「マップ値」されます。

1
Yash