2016-07-07 22 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