Ошибка при использовании функции освобождения от forcats

У меня есть датафрейм с X, Y значения координат и соответствующие ID значения в Val,

df1 <- data.frame(X=rnorm(1000,0,1), Y=rnorm(1000,0,1), 
                 ID=paste(rep("ID", 1000), 1:1000, sep="_"),
                 Type=rep("ID",1000),
                 Val=c(rep(c('Type1','Type2'),300),
                       rep(c('Type3','Type4'),200)))

Добавление недостающих идентификаторов для существующих X,Y значения в df1,

dat2 <- data.frame(Type=rep('D',8),
                   Val=paste(rep("D", 8), 
                             sample(1:2,8,replace=T), sep="_"))
dat2 <- cbind(df[sample(1:1000,80),1:3],dat2)

df1 <- rbind(df1, dat2)

Смотря на частоту значений ID.

df1 %>% count(Val)

# # A tibble: 6 x 2
#      Val     n
#   <fctr> <int>
# 1  Type1   300
# 2  Type2   300
# 3  Type3   200
# 4  Type4   200
# 5    D_1    60
# 6    D_2    20

Меня интересуют только два идентификатора для дальнейшего анализа, а остальные могут быть сгруппированы в случайное значение. С помощью fct_other функция, я перекодировал их в Other и частота выглядит как ожидалось.

df1 %>% mutate(Val=fct_other(Val,keep=c('D_1','D_2'))) %>% count(Val)

# # A tibble: 3 x 2
#      Val     n
#   <fctr> <int>
# 1    D_1    60
# 2    D_2    20
# 3  Other  1000

Как fct_other функция помещает "Другие" значения в качестве последнего значения фактора, и я хочу сначала, я использовал другую функцию fct_relevel доступны в той же упаковке.

df1 %>% mutate(Val=fct_other(Val,keep=c('Type5','Type6'))) %>% 
  mutate(Val=fct_relevel(Val,'Other'))%>% 
  count(Val)

# # A tibble: 1 x 2
#      Val     n
#   <fctr> <int>
# 1  Other  1080

Но это дает неожиданные результаты. Есть идеи, что могло пойти не так?

Обновление: ошибка пыталась сохранить недоступные значения.

df1 %>% mutate(Val=fct_other(Val,keep=c('D_1','D_2'))) %>% 
  mutate(Val=fct_relevel(Val,'Other'))%>% count(Val)

# # A tibble: 3 x 2
#      Val     n
#   <fctr> <int>
# 1  Other  1000
# 2    D_1    30
# 3    D_2    50

Когда я пытался сохранить уникальные значения, выбранные отсутствуют:

df1 %>% mutate(Val=fct_other(Val,keep=c('D_1','D_2'))) %>% 
  mutate(Val=fct_relevel(Val,'Other'))%>% 
  arrange(Val) %>% filter(!duplicated(.[,c("X","Y")])) %>% count(Val)

# # A tibble: 1 x 2
#       Val     n
#     <fctr> <int>
#   1  Other  1000

Повторное выравнивание после извлечения уникальных значений делает работу:

df1 %>% mutate(Val=fct_other(Val,keep=c('D_1','D_2'))) %>% 
  arrange(Val) %>% filter(!duplicated(.[,c("X","Y")])) %>% 
  mutate(Val=fct_relevel(Val,'Other'))  %>% 
  arrange(Val) %>% count(Val)
# # A tibble: 3 x 2
#      Val     n
#   <fctr> <int>
# 1  Other   920
# 2    D_1    30
# 3    D_2    50

Это эффективный способ сделать это?

0 ответов

Другие вопросы по тегам