【问题标题】:R: Create duplicate rows based on a variable (dplyr preferred) [duplicate]R:根据变量创建重复行(首选dplyr)[重复]
【发布时间】:2019-03-01 01:51:10
【问题描述】:

我想根据 R 中的现有列表创建一个包含重复条目的新列表。我正在尝试尽可能多地使用 tidyverse,因此首选 dplyr。

假设我有一个销售发生时间的列表:

df <- data.frame(time = c(0,1,2,3,4,5), sales = c(1,1,2,1,1,3))

> df
  time sales
1    0     1
2    1     1
3    2     2
4    3     1
5    4     1
6    5     3

我想要一个包含每个销售条目的列表:

ans <- data.frame(salesTime = c(0,1,2,2,3,4,5,5,5))

> ans
  salesTime
1         0
2         1
3         2
4         2
5         3
6         4
7         5
8         5
9         5

我在这里找到了一个使用 dplyr 的有趣示例:Create duplicate rows based on conditions in R

但这只会让我在 sales == n 时创建一个新行,而不是在 sales == n 时创建 n 个新行。

任何帮助将不胜感激。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    一个不错的tidyr函数是uncount()

    df %>%
      uncount(sales) %>%
      rename(salesTime = time)
    
        salesTime
    1           0
    2           1
    3           2
    3.1         2
    4           3
    5           4
    6           5
    6.1         5
    6.2         5
    

    【讨论】:

    • 我真的很喜欢这个,我完全不知道 tidyr::uncount!
    【解决方案2】:
    data.frame(salesTime = rep(df$time, df$sales))
    
    #  salesTime
    #1         0
    #2         1
    #3         2
    #4         2
    #5         3
    #6         4
    #7         5
    #8         5
    #9         5
    

    如果你喜欢 dplyr 和管道,你可以选择:

    df %>% {data.frame(salesTime = rep(.$time, .$sales))}
    

    【讨论】:

    • 谢谢!非常清楚。我知道我把事情复杂化了......
    • @colton 我这里没有一个好的 dplyr 解决方案,因为你的“新 col”比原始数据长。
    • @Andre Elrico 也许是一个“不好”的人?
    【解决方案3】:
    df %>% rowwise %>% mutate(time=list(rep(time,sales))) %>% unnest
    ## A tibble: 9 x 2
    #  sales  time
    #  <dbl> <dbl>
    #1     1     0
    #2     1     1
    #3     2     2
    #4     2     2
    #5     1     3
    #6     1     4
    #7     3     5
    #8     3     5
    #9     3     5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-11
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      相关资源
      最近更新 更多