Leer encabezados de dos líneas en R

¿Cuál es la mejor manera de leer un archivo en R cuando el encabezado tiene dos líneas necesarias para el encabezado?

Esto me sucede todo el tiempo, ya que las personas a menudo usan una línea para el nombre de la columna y luego incluyen otra línea debajo de ella para la unidad de medida. No quiero omitir nada. Quiero que los nombres y las unidades se lleven a cabo.

Aquí está lo que podría ser un archivo típico con dos encabezados :

trt biomass yield crop Mg/ha bu/ac C2 17.76 205.92 C2 17.96 207.86 CC 17.72 197.22 CC 18.42 205.20 CCW 18.15 200.51 CCW 17.45 190.59 P 3.09 0.00 P 3.34 0.00 S2 5.13 49.68 S2 5.36 49.72 

Haría dos pasos, asumiendo que sabemos que la primera fila contiene las tags, y siempre hay dos encabezados.

 header <- scan("file.txt", nlines = 1, what = character()) data <- read.table("file.txt", skip = 2, header = FALSE) 

A continuación, agregue el header vector de caracteres como el componente de names :

 names(data) <- header 

Para sus datos esto sería

 header <- scan("data.txt", nlines = 1, what = character()) data <- read.table("data.txt", skip = 2, header = FALSE) names(data) <- header head(data) > head(data) trt biomass yield 1 C2 17.76 205.92 2 C2 17.96 207.86 3 CC 17.72 197.22 4 CC 18.42 205.20 5 CCW 18.15 200.51 6 CCW 17.45 190.59 

Si quieres las unidades, según la respuesta de @DWin, haz un segundo scan() en la línea 2

 header2 <- scan("data.txt", skip = 1, nlines = 1, what = character()) names(data) <- paste0(header, header2) > head(data) trtcrop biomassMg/ha yieldbu/ac 1 C2 17.76 205.92 2 C2 17.96 207.86 3 CC 17.72 197.22 4 CC 18.42 205.20 5 CCW 18.15 200.51 6 CCW 17.45 190.59 

Utilice readLines con 2 para el límite, paste0 , paste0 , luego lea con read.table con skip =2 y header=FALSE (valor predeterminado). Termine el proceso con la asignación de los nombres de las columnas:

 dat <- "trt biomass yield crop Mg/ha bu/ac C2 17.76 205.92 C2 17.96 207.86 CC 17.72 197.22 CC 18.42 205.20 CCW 18.15 200.51 CCW 17.45 190.59 P 3.09 0.00 P 3.34 0.00 S2 5.13 49.68 S2 5.36 49.72 " 

Probablemente usaría un argumento de archivo, pero usar el argumento de text para las funciones de lectura lo hace más autónomo:

  readLines(textConnection(dat),n=2) #[1] "trt\tbiomass\tyield" "crop\tMg/ha\tbu/ac" head2 <- read.table(text=readLines(textConnection(dat),n=2), sep="\t", stringsAsFactors=FALSE) with(head2, paste0(head2[1,],head2[2,]) ) # [1] "trtcrop" "biomassMg/ha" "yieldbu/ac" joinheadrs <- with(head2, paste0(head2[1,],head2[2,]) ) newdat <- read.table(text=dat, sep="\t",skip=2) colnames(newdat)<- joinheadrs #------------------- > newdat trtcrop biomassMg/ha yieldbu/ac 1 C2 17.76 205.92 2 C2 17.96 207.86 3 CC 17.72 197.22 4 CC 18.42 205.20 5 CCW 18.15 200.51 6 CCW 17.45 190.59 7 P 3.09 0.00 8 P 3.34 0.00 9 S2 5.13 49.68 10 S2 5.36 49.72 

Podría ser mejor usar pasta con un guión bajo:

 joinheadrs <- with(head2, paste(head2[1,],head2[2,] ,sep="_") ) joinheadrs #[1] "trt_crop" "biomass_Mg/ha" "yield_bu/ac" 

Casi el mismo método para las otras respuestas, simplemente acortando a 2 declaraciones:

 dat <- "trt biomass yield crop Mg/ha bu/ac C2 17.76 205.92 C2 17.96 207.86 CC 17.72 197.22 CC 18.42 205.20 CCW 18.15 200.51 CCW 17.45 190.59 P 3.09 0.00 P 3.34 0.00 S2 5.13 49.68 S2 5.36 49.72" header <- sapply(read.table(text=dat,nrow=2),paste,collapse="_") result <- setNames(read.table(text=dat,skip=2),header) 

Resultado:

 > head(result,2) trt_crop biomass_Mg/ha yield_bu/ac 1 C2 17.76 205.92 2 C2 17.96 207.86 ... 

Un enfoque paso a paso explicado ligeramente diferente:

  1. Lea solo las primeras dos líneas de los archivos como datos (sin encabezados):

     headers <- read.table("data.txt", nrows=2, header=FALSE) 
  2. Cree los nombres de los encabezados con las dos (o más) primeras filas, sappy permite hacer operaciones sobre las columnas (en este caso pegar) - lea más sobre sapply aquí :

     headers_names <- sapply(headers,paste,collapse="_") 
  3. Lea los datos de los archivos (omitiendo las primeras 2 filas):

     data <- read.csv(file="data.txt", skip = 2, header=FALSE) 
  4. Y asigne los encabezados del paso dos a los datos:

     names(data) <- headers_names 

La ventaja es que tendría un control claro de los parámetros de read.table (como sep para comas y stringAsFactors - tanto para los encabezados como para los datos)