如何在R中基于因子的水平复制行

时间:2019-03-21 07:26:52

标签: r dplyr duplicates tidyr

我有以下数据框

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

我看了几个关于stackoverflow的问题,但是通常,人们希望根据某个因素删除重复项,而不是创建它们。 知道怎么做吗?基于tidyr / dplyr的解决方案将不胜感激。

3 个答案:

答案 0 :(得分:1)

我们可以使用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

答案 1 :(得分:1)

这是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

答案 2 :(得分:1)

以下是一些与R expand.grid()一起使用的情况:

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