Как продублировать строку на основе уровней фактора в R - PullRequest
0 голосов
/ 21 марта 2019

У меня есть следующий фрейм данных

MyData = data.frame(
  id = 1:2, 
  choice = factor(c('red', 'blue')),
  grade = c(60, 70))

  id choice grade
1  1    red    60
2  2   blue    70

Я хочу дублировать каждую строку в соответствии с уровнем «выбора».Таким образом, строка должна дублироваться один раз для каждого уровня переменной «выбор».Так что мне нужен один ряд для уровня «синий» и один для «красный».Ниже:

  id choice grade
1  1   blue    60
2  1    red    60
3  2   blue    70
4  2    red    70

Я рассмотрел несколько вопросов о стековом потоке, но обычно люди хотят удалять дубликаты на основе фактора, а не создавать их.Есть идеи, как это сделать?Решение, основанное на tidyr / dplyr, приветствуется.

Ответы [ 3 ]

1 голос
/ 21 марта 2019

Вот подход dplyr & tidyr:

library(dplyr); library(tidyr)
MyData %>% 
  group_by(id) %>% 
  complete(choice, grade)

#     id choice grade
#  <int> <fct>  <dbl>
#1     1 blue      60
#2     1 red       60
#3     2 blue      70
#4     2 red       70
1 голос
/ 21 марта 2019

Вот некоторая игра с expand.grid() из базы R:

library(dplyr)
with(MyData, expand.grid(id = id, choice = choice)) %>% 
  left_join(
    y = MyData %>% select(id, grade), 
    by = "id"
  )

  id choice grade
1  1    red    60
2  2    red    70
3  1   blue    60
4  2   blue    70
1 голос
/ 21 марта 2019

Мы можем использовать levels(choice), чтобы получить все уровни, затем сделать separate_rows

library(dplyr)
library(tidyr)
mutate(MyData, choice=toString(levels(choice))) %>% separate_rows(choice)

id choice grade
1  1   blue    60
2  1    red    60
3  2   blue    70
4  2    red    70
...