2016-07-07 3 views
4

У меня возникли проблемы с повторением строк моих реальных данных с использованием dplyr. Здесь уже есть другая запись repeat-rows-of-a-data-frame, но нет решения для dplyr.Повторение строк data.frame в dplyr

Здесь я просто удивляюсь, как может быть решением для 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 в пределах dplyr трубы (хотя, CECI n'est па ип труба):

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

По моему опыту, 'do' очень медленный. Вы можете 'slice' как' df%>% slice (rep (1: n(), each = 4)) '. Это также относится к большему количеству столбцов. – Frank

+2

Хорошая альтернатива, и это, безусловно, более элегантно. Я пытался придумать что-то подобное, но мой мозг продолжал бунтовать. Спасибо, Фрэнк! (И я согласен, 'do' имеет тенденцию к тому, чтобы забивать вещи, известное узкое место.) – 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 Б, 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 
Смежные вопросы