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