【问题标题】:How to duplicate a row based on the levels of a factor, in R如何在R中根据因子的水平复制一行
【发布时间】:2019-03-21 15:44:53
【问题描述】:

我有以下数据框

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 的解决方案将不胜感激。

【问题讨论】:

标签: r dplyr duplicates tidyr


【解决方案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】:

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

    【讨论】:

      【解决方案3】:

      这里有一些来自 base 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
      

      【讨论】:

        猜你喜欢
        • 2019-03-18
        • 2023-04-01
        • 1970-01-01
        • 2019-08-06
        • 2021-11-14
        • 2016-03-06
        • 1970-01-01
        • 2012-09-12
        • 1970-01-01
        相关资源
        最近更新 更多