Ошибка при использовании функции освобождения от 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
Это эффективный способ сделать это?