Concatenar cadenas por grupo con dplyr

tengo un dataframe que se parece a esto

> data  data foo bar 1 1 a 2 1 b 3 2 a 4 3 b 5 3 c 6 3 d 

Me gustaría crear una nueva columna bars_by_foo que sea la concatenación de los valores de bar por foo. Entonces, los nuevos datos deberían verse así:

  foo bar bars_by_foo 1 1 a ab 2 1 b ab 3 2 aa 4 3 b bcd 5 3 c bcd 6 3 d bcd 

Tenía la esperanza de que lo siguiente funcionaría:

 p % group_by(foo) %>% mutate(bars_by_foo=p(bar)) 

Pero ese código me da un error

Error: incompatible types, expecting a character vector .

¿Qué estoy haciendo mal?

Simplemente podrías hacer

 data %>% group_by(foo) %>% mutate(bars_by_foo = paste0(bar, collapse = "")) 

Sin funciones auxiliares

Parece que hay un pequeño problema con la función de mutate : he descubierto que es un mejor enfoque trabajar con un summarise cuando se agrupan datos en dplyr (aunque de ninguna manera es una regla dura).

paste función de paste también introduce espacios en blanco en el resultado, por lo tanto, establezca sep = 0 o use simplemente use paste0 .

Aquí está mi código:

 p <- function(v) { Reduce(f=paste0, x = v) } data %>% group_by(foo) %>% summarise(bars_by_foo = p(as.character(bar))) %>% merge(., data, by = 'foo') %>% select(foo, bar, bars_by_foo) 

Resultando en..

  foo bar bars_by_foo 1 1 a ab 2 1 b ab 3 2 aa 4 3 b bcd 5 3 c bcd 6 3 d bcd 

Puedes intentar esto:

 agg <- aggregate(bar~foo, data = data, paste0, collapse="") df <- merge(data, agg, by = "foo", all = T) colnames(df) <- c(colnames(data), "bars_by_foo") # optional # foo bar bars_by_foo # 1 1 a ab # 2 1 b ab # 3 2 aa # 4 3 b bcd # 5 3 c bcd # 6 3 d bcd 

Su función funciona si se asegura de que la barra sea todos los caracteres y no los niveles de un factor.

 data <- data.frame(foo=c(1, 1, 2, 3, 3, 3), bar=c('a', 'b', 'a', 'b', 'c', 'd'), stringsAsFactors = FALSE) library("dplyr") p <- function(v) { Reduce(f=paste, x = v) } data %>% group_by(foo) %>% mutate(bars_by_foo=p(bar)) Source: local data frame [6 x 3] Groups: foo [3] foo bar bars_by_foo    1 1 aab 2 1 bab 3 2 aa 4 3 bbcd 5 3 cbcd 6 3 dbcd