Próbuję dostarczyć dwie funkcje wewnątrz Mutate (w poprzek (gdzie (IS.Factor))) , aby zamówić poziomy czynnika i upuścić niewykorzystane poziomy. Kod pojawia się nie działać zgodnie z oczekiwaniami. Gdzie mogło się mylić?

#---- Libraries ----

library(tidyverse)

#---- Data ----

set.seed(2021)

df <- tibble(
  a1 = factor(ifelse(sign(rnorm(30))==-1, 0, 1), labels = c("No", "Yes")),
  a2 = factor(ifelse(sign(rnorm(30))==-1, 0, 1), labels = c("No", "Yes")),
  gender = gl(2, 15, labels = c("Males", "Females")),
  b2 = gl(3, 10, labels = c("Primary", "Secondary", "Tertiary", "Unknown")),
  c1 = gl(3, 10, labels = c("15-19", "20-24", "25-30", "30-35")),
  outcome = factor(ifelse(sign(rnorm(30))==-1, 0, 1), labels = c("No", "Yes")),
  weight = runif(30, 1, 12)
)

#---- Problem ----

df <- df %>%
  mutate(across(where(is.factor), list(fct_infreq, fct_drop)))

levels(df$b2)

# The unused levels not dropped

1
Moses 13 kwiecień 2021, 12:22

1 odpowiedź

Najlepsza odpowiedź

Problem polega na tym, że w rzeczywistości zwraca się do dwóch nowych kolumn, więc zobaczysz w uzyskanym dataframe, że istnieją dwie kolumny b2_1 i b2_2, każdy odpowiadający stosowaniu dwóch funkcji.

Jeśli uruchomisz levels(df$b2_2), zobaczysz żądane wyjście.

Jeśli twój cel jest najpierw upuść, a następnie zmienić kolejność, musisz uruchomić kolejne zamuany:

df <- df %>%
  mutate(across(where(is.factor), fct_drop)) %>% 
  mutate(across(where(is.factor), fct_infreq)) 
  

Lub uruchom zagnieżdżone funkcje w swoim mutowaniu

df <- df %>%
  mutate(across(where(is.factor), ~fct_infreq(fct_drop(.x))))
5
Keith McNulty 13 kwiecień 2021, 10:26