Чтение двухстрочных заголовков в R

Каков наилучший способ чтения файла в R, когда заголовок имеет две необходимые строки для заголовка?

Это происходит со мной все время, поскольку люди часто используют одну строку для имени столбца, а затем include в себя еще одну строку под ней для единицы измерения. Я не хочу ничего пропускать. Я хочу, чтобы имена и единицы выполнялись.

Вот как выглядит типичный файл с двумя заголовками :

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 <- scan("file.txt", nlines = 1, what = character()) data <- read.table("file.txt", skip = 2, header = FALSE) 

Затем добавьте header вектора символов в качестве компонента names :

 names(data) <- header 

Для ваших данных это будет

 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 

Если вы хотите, чтобы единицы, как ответ @ DWin, затем выполнили второе scan() в строке 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 

Используйте readLines с 2 для ограничения, проанализируйте его, paste0 вместе, а затем прочитайте с помощью read.table с skip =2 и header=FALSE (по умолчанию). Закончите процесс с присвоением имен столбцов:

 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 " 

Вероятно, вы использовали бы аргумент файла, но использование text аргумента для функций чтения делает это более самодостаточным:

  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 

Лучше использовать пасту с подчеркиванием-sep:

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

Почти тот же метод для других ответов, просто сокращаясь до двух утверждений:

 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) 

Результат:

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

Несколько по-разному объясняется поэтапный подход:

  1. Прочитайте только первые две строки файлов в виде данных (без заголовков):

     headers <- read.table("data.txt", nrows=2, header=FALSE) 
  2. Создайте имена заголовков с двумя (или более) первыми строками, sappy позволяет делать операции над столбцами (в этом случае вставлять) - подробнее читайте здесь :

     headers_names <- sapply(headers,paste,collapse="_") 
  3. Прочитайте данные файлов (пропустив первые 2 строки):

     data <- read.csv(file="data.txt", skip = 2, header=FALSE) 
  4. И присвойте заголовкам второго шага данные:

     names(data) <- headers_names 

Преимущество состоит в том, что у вас будет четкое управление параметрами read.table (например, sep для запятых и stringAsFactors - как для заголовков, так и для данных)

  • Вставка двух векторов с комбинациями всех элементов векторов
  • Выберите только первые строки для каждого уникального значения столбца в R
  • R Shiny - добавить tabPanel в tabsetPanel динамически (с использованием renderUI)
  • скептически отслеживает, как очистить данные с этого сайта (используя R)
  • Вычислите смежные пропорции
  • Построение графика с помощью ggplot2: «Ошибка: дискретное значение, заданное для непрерывного масштабирования» по категориальной оси y
  • Использование пакета rJava на Win7 64 бит с R
  • Вставить несколько столбцов вместе
  • Проверьте, находится ли точка в пространственном объекте, который состоит из нескольких полигонов / отверстий
  • Как преобразовать R Markdown в HTML? Т.е. что делает «вязать HTML» в Rstudio 0.96?
  • Импортировать данные в R с неизвестным количеством столбцов?
  • Interesting Posts

    Что быстрее, копируя все сразу или одно за раз?

    В чем разница между ними (bCondition == NULL) и (NULL == bCondition)?

    Java Date rounding

    Более полезная статусная линия в vim?

    Как отображать навигационный ящик во всех действиях?

    Как скопировать файлы на жесткий диск NTFS только для чтения на Mac?

    Изменить тип сети для адаптера (общедоступный или частный)

    Приложение неверно настроено для входа в Facebook: проблема интеграции Android Facebook

    Не удалось прочитать InputStream из Java Process (Runtime.getRuntime (). Exec () или ProcessBuilder)

    Генератор изображений BarCode в Java

    Версия Linux с командной строкой?

    Обновление текстового документа MS из двух других документов

    Регулярное выражение для соответствия 3 или более последовательным последовательным символам и последовательным идентичным символам

    Расшифровка трафика SSL в Wireshark. Только заголовки получают расшифровку

    Динамический (Default.png) splashscreen в 3.0

    Давайте будем гением компьютера.