Как уменьшить уровни факторов в зависимости от другого атрибута? - PullRequest
1 голос
/ 20 января 2020

У меня есть два столбца данных id и result, и я хочу назначить уровни факторов для результата в зависимости от id. Таким образом, для идентификатора "1" результат c("a","b","c","d") будет иметь уровни факторов 1,2,3,4. Для идентификатора "2" результат c("22","23","24") будет иметь уровни факторов 1,2,3.

id <- c(1,1,1,1,2,2,2)
result <- c("a","b","c","d","22","23","24")

Я попытался сгруппировать их по разбиению, но они будут преобразованы в список вместо фрейма данных , что вызывает проблему длины для моделирования. Можете ли вы помочь, пожалуйста?

Ответы [ 2 ]

2 голосов
/ 20 января 2020

Хотя вопрос был закрыт как дубликат пользователем @ Ронак Шах , я не думаю, что это тот же вопрос.

После нумерации строки по группе новый столбец должен быть приведен к классу "factor".

library(dplyr)

id <- c(1,1,1,1,2,2,2)
result <- c("a","b","c","d","22","23","24")

df <- data.frame(id, result)

df %>%
  group_by(id) %>%
  mutate(fac = row_number()) %>%
  ungroup() %>%
  mutate(fac = factor(fac))
# A tibble: 7 x 3
#     id result fac  
#  <dbl> <fct>  <fct>
#1     1 a      1    
#2     1 b      2    
#3     1 c      3    
#4     1 d      4    
#5     2 22     1    
#6     2 23     2    
#7     2 24     3    

Правка.

Если есть повторяющиеся значения в result, принудительно as.integer/factor для получения чисел, затем приведение этих чисел к фактору.

id2 <- c(1,1,1,1,2,2,2,2)
result2 <- c("a","b","c","d","22", "22","23","24")

df2 <- data.frame(id = id2, result = result2)

df2 %>%
  group_by(id) %>%
  mutate(fac = as.integer(factor(result))) %>%
  ungroup() %>%
  mutate(fac = factor(fac))
# A tibble: 8 x 3
#     id result fac  
#  <dbl> <fct>  <fct>
#1     1 a      1    
#2     1 b      2    
#3     1 c      3    
#4     1 d      4    
#5     2 22     1    
#6     2 22     1    
#7     2 23     2    
#8     2 24     3    
0 голосов
/ 20 января 2020

После группировки по id мы можем использовать match с unique, чтобы назначить уникальный номер каждому result. Использование фрейма данных @Rui Barradas df2

library(dplyr)

df2 %>%
  group_by(id) %>%
  mutate(ans = match(result, unique(result))) %>%
  ungroup %>%
  mutate(ans = factor(ans))

#     id result ans  
#  <dbl> <fct>  <fct>
#1     1 a      1    
#2     1 b      2    
#3     1 c      3    
#4     1 d      4    
#5     2 22     1    
#6     2 22     1    
#7     2 23     2    
#8     2 24     3    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...