Concatenar en fila a través de columnas específicas de dataframe

Tengo un dataframe con columnas que, cuando se concatena (en filas) como una cadena, me permitiría dividir el dataframe en la forma deseada.

> str(data) 'data.frame': 680420 obs. of 10 variables: $ A : chr "2011-01-26" "2011-01-26" "2011-02-09" "2011-02-09" ... $ B : chr "2011-01-26" "2011-01-27" "2011-02-09" "2011-02-10" ... $ C : chr "2011-01-26" "2011-01-26" "2011-02-09" "2011-02-09" ... $ D : chr "AAA" "AAA" "BCB" "CCC" ... $ E : chr "A00001" "A00002" "B00002" "B00001" ... $ F : int 9 9 37 37 37 37 191 191 191 191 ... $ G : int NA NA NA NA NA NA NA NA NA NA ... $ H : int 4 4 4 4 4 4 4 4 4 4 ... 

Para cada fila, me gustaría concatenar los datos en las columnas F, E, D y C en una cadena (con el carácter de subrayado como separador). Debajo está mi bash fracasado de esto:

 data$id <- sapply(as.data.frame(cbind(data$F,data$E,data$D,data$C)), paste, sep="_") 

Y a continuación está el resultado no deseado:

  > str(data) 'data.frame': 680420 obs. of 10 variables: $ A : chr "2011-01-26" "2011-01-26" "2011-02-09" "2011-02-09" ... $ B : chr "2011-01-26" "2011-01-27" "2011-02-09" "2011-02-10" ... $ C : chr "2011-01-26" "2011-01-26" "2011-02-09" "2011-02-09" ... $ D : chr "AAA" "AAA" "BCB" "CCC" ... $ E : chr "A00001" "A00002" "B00002" "B00001" ... $ F : int 9 9 37 37 37 37 191 191 191 191 ... $ G : int NA NA NA NA NA NA NA NA NA NA ... $ H : int 4 4 4 4 4 4 4 4 4 4 ... $ id : chr [1:680420, 1:4] "9" "9" "37" "37" ... ..- attr(*, "dimnames")=List of 2 .. ..$ : NULL .. ..$ : chr "V1" "V2" "V3" "V4" 

Cualquier ayuda sería muy apreciada.

Tratar

  data$id <- paste(data$F, data$E, data$D, data$C, sep="_") 

en lugar. La belleza del código vectorizado es que no necesita bucles de fila por fila ni funciones equivalentes de bucle *.

Editar aún mejor es

  data <- within(data, id <- paste(F, E, D, C, sep="")) 

Utilice el paquete tidyr of tidyr :

 require(tidyr) data <- data %>% unite(id, F, E, D, C, sep = '_') 

El primer parámetro es el nombre deseado, todo el próximo hasta sep – columnas para concatenar.

Cualquiera de stringr::str_c() o paste() funcionará.

 require(stringr) data <- within(data, str_c(F,E,D,C, sep="_") or else data <- within(data, paste(F,E,D,C, sep="_")