2016-07-07 52 views
4

我在使用dplyr重复我的真实数据的行时遇到了问题。这里已经有另一个帖子repeat-rows-of-a-data-frame,但没有解决方案dplyr在dplyr中重复data.frame的行

在这里我只是想知道如何能为dplyr 的解决方案,但失败,错误:

Error: wrong result size (16), expected 4 or 1

library(dplyr) 
    df <- data.frame(column = letters[1:4]) 

    df_rep <- df%>% 
     mutate(column=rep(column,each=4)) 

预计输出

>df_rep 
    column 
    #a 
    #a 
    #a 
    #a 
    #b 
    #b 
    #b 
    #b 
    #* 
    #* 
    #* 
+1

我能想到的唯一方法就是将数据流写入一个'do'块,然后从当前的data.frame中生成一个新的数据,就像你想要的那样('df%>%do(data.frame(column = rep 。$ column,4)))')。但是,如果data.frame有任何其他列,这充满了危险。 – r2evans

+0

@ r2evans很棒。您可以将其作为答案发送。只需要改变'do(data.frame(a = rep(。$ a,each = 4)))'。 – Alexander

回答

2

这是充满了危险,如果data.frame有其他专栏(在那里,我说过!),但do区块将允许您在内生成派生的data.frame管材(虽然,CECI n'est PAS未管):

library(dplyr) 
df <- data.frame(column = letters[1:4], stringsAsFactors = FALSE) 
df %>% 
    do(data.frame(column = rep(.$column, each = 4), stringsAsFactors = FALSE)) 
# column 
# 1  a 
# 2  a 
# 3  a 
# 4  a 
# 5  b 
# 6  b 
# 7  b 
# 8  b 
# 9  c 
# 10  c 
# 11  c 
# 12  c 
# 13  d 
# 14  d 
# 15  d 
# 16  d 
+17

以我的经验,“做”是非常缓慢的。你可以像'df%>%slice(rep(1:n(),each = 4)'''''一样切片。这也处理了更多列的情况。 – Frank

+2

不错的选择,它当然更优雅。我试图想出类似的东西,但我的大脑不断反叛。谢谢,弗兰克! (我同意,“做”往往会把事情弄糟,这是一个已知的瓶颈。) – r2evans

1

我一直在寻找一个类似(但略有不同)的解决方案。张贴在这里,以防其他人有用。

在我的情况下,我需要一个更通用的解决方案,允许每个字母重复任意次数。以下是我想出了:

library(tidyverse) 

df <- data.frame(letters = letters[1:4]) 
df 

> df 
    letters 
1  a 
2  b 
3  c 
4  d 

比方说,我想2 A的,3级B的,2周C的4 D'S:

df %>% 
    mutate(count = c(2, 3, 2, 4)) %>% 
    group_by(letters) %>% 
    expand(count = seq(1:count)) 

# A tibble: 11 x 2 
# Groups: letters [4] 
    letters count 
    <fctr> <int> 
1  a  1 
2  a  2 
3  b  1 
4  b  2 
5  b  3 
6  c  1 
7  c  2 
8  d  1 
9  d  2 
10  d  3 
11  d  4 

如果你不想保持数列:

df %>% 
    mutate(count = c(2, 3, 2, 4)) %>% 
    group_by(letters) %>% 
    expand(count = seq(1:count)) %>% 
    select(letters) 

# A tibble: 11 x 1 
# Groups: letters [4] 
    letters 
    <fctr> 
1  a 
2  a 
3  b 
4  b 
5  b 
6  c 
7  c 
8  d 
9  d 
10  d 
11  d 

如果你想计数,以反映每个字母重复的次数:

df %>% 
    mutate(count = c(2, 3, 2, 4)) %>% 
    group_by(letters) %>% 
    expand(count = seq(1:count)) %>% 
    mutate(count = max(count)) 

# A tibble: 11 x 2 
# Groups: letters [4] 
    letters count 
    <fctr> <dbl> 
1  a  2 
2  a  2 
3  b  3 
4  b  3 
5  b  3 
6  c  2 
7  c  2 
8  d  4 
9  d  4 
10  d  4 
11  d  4