2015-08-23 1 views
2

Я пытаюсь использовать rep с dplyr, но я не совсем понимаю, почему я не могу заставить его работать.dplyr повторение внутри%>% оператор

Мои данные выглядят следующим образом. Я хочу просто повторить dayweek по n для каждого id.

head(dt4) 

    id dayweek n 
1 1 Friday 3 
2 1 Monday 3 
3 1 Saturday 3 
4 1 Sunday 3 
5 1 Thursday 3 
6 1 Tuesday 3 

То, что я пытаюсь сделать это в пределах dplyr потока

cbind(rep(dt4$id, dt4$n), rep(as.character(dt4$dayweek), dt4$n)) 

, который дает

[,1] [,2]  
[1,] "1" "Friday" 
[2,] "1" "Friday" 
[3,] "1" "Friday" 
[4,] "1" "Monday" 
[5,] "1" "Monday" 
[6,] "1" "Monday" 

Я не понимаю, почему этот код не работает

dt4 %>% 
    group_by(id) %>% 
    summarise(rep(dayweek, n)) 

Error: expecting a single value 

Может ли кто-нибудь поможет мне в этом?

данные

dt4 = structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), dayweek = structure(c(1L, 
2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L, 
4L, 5L, 6L, 7L), .Label = c("Friday", "Monday", "Saturday", "Sunday", 
"Thursday", "Tuesday", "Wedesnday"), class = "factor"), n = c(3, 
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3)), class =  "data.frame", .Names = c("id", 
"dayweek", "n"), row.names = c(NA, -21L)) 
+1

не могут сделать задание, оно показывает 'id' не найдено. –

+2

'summaryise' предназначен для возврата единственного значения для каждой группы. Вероятно, вам повезет больше с 'do' –

+0

: https://stackoverflow.com/questions/21737815/ и https://github.com/hadley/dplyr/issues/154 –

ответ

3

Чтобы получить тот же результат, как cbind, мы можем использовать do. Как упоминал @DavidArenburg, summarise выводит одиночное значение/строку для каждой групповой комбинации, а используя mutate, мы получаем выход с таким же количеством строк. Но здесь мы делаем другую операцию, которая может быть выполнена в среде do. В коде . обозначается набор данных. Если мы хотим извлечь столбец «id» из dt4, мы можем либо использовать dt4$id, либо dt4[['id']]. Замените dt4 на ..

library(dplyr) 
dt4 %>% 
    group_by(id) %>% 
    do(data.frame(id=.$id, v1=rep(.$dayweek, .$n))) 
#Source: local data frame [63 x 2] 
#Groups: id 

# id  v1 
#1 1 Friday 
#2 1 Friday 
#3 1 Friday 
#4 1 Monday 
#5 1 Monday 
#6 1 Monday 
#7 1 Saturday 
#8 1 Saturday 
#9 1 Saturday 
#10 1 Sunday 
#.. ..  ... 

Или другой вариант на основе @ комментарии Франка будут указывать индекс строки, созданный из rep внутри slice и select столбцов, которые мы должны сохранить.

dt4 %>% 
    slice(rep(1:n(),n)) %>% 
    select(-n) 
+0

ah интересно - не могли бы вы объяснить мне, что делает? и как вы используете символ '. $' здесь? спасибо Akrun – giacomo

+0

Что делает 'group_by' в этом контексте? (Извините, набор данных из вопроса все еще кажется сломанным.) – maj

+0

@maj В примере есть только один идентификатор, но я предполагаю, что в исходном наборе данных может быть несколько идентификаторов, и мы хотим сделать шаг репликации в каждой группе id – akrun

5

data.table может быть полезной альтернативой для этого типа сделай операцией - я считаю, это немного легче читать:

library("data.table") 
dt4 <- as.data.table(dt4) 
head(dt4[, rep(dayweek, n), by=id], 10) 

дает:

id  V1 
1: 1 Friday 
2: 1 Friday 
3: 1 Friday 
4: 1 Monday 
5: 1 Monday 
6: 1 Monday 
7: 1 Saturday 
8: 1 Saturday 
9: 1 Saturday 
10: 1 Sunday 
+0

, спасибо очень интересно – giacomo