基于一个变量创建重复的行(首选使用dplyr)

13

我想在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的有趣示例:在R中基于条件创建重复行

但是这只允许我在销售额等于n时创建一行新记录,并且不能在销售额等于n时创建n个新的行。

非常感谢任何帮助。

3个回答

27

一个适用于此的不错的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

3
我很喜欢这个,我之前完全不知道tidyr::uncount! - colton
很好的例子!我也不知道uncount()这个函数。如果你有一个只有一行的数据集,你可以用df |> uncount(10)将它复制成10行。真棒! - MS Berends

4
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
@colton 我认为在这里没有一个好的dplyr解决方案,因为你的“新列”比原始数据更长。 - Andre Elrico
也许是一个“不好的”吗? - Nicolas2

2
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接