Объединение двух заголовков в один

Очень простой вопрос. Я использую лист excel, который имеет две строки для заголовков столбцов; как я могу преобразовать эти две строки в одну? Кроме того, эти заголовки не начинаются в верхней части листа.

Таким образом, у меня есть DF1

Temp Press  Reagent  Yield A  Conversion etc
degC bar    /g       %        %             
1    2      3        4        5          
6    7      8        9        10

и я хочу,

Temp degC Press bar  Reagent /g  Yield A % Conversion etc
1         2          3           4         5          
6         7          8           9        10

Использование colnames (DF1) возвращает верхние имена, но получение второй линии для слияния с верхним продолжает ускользать от меня.

0
nl ja de
Сделайте свой пример воспроизводимым и посмотрите на merge .
добавлено автор Paul Hiemstra, источник
Выгрузите данные в файл .csv из Excel и загрузите файлы.
добавлено автор Paul Hiemstra, источник
Мне трудно (например, воспроизвести), потому что я копирую с листа excel в буфер обмена и получаю данные в R через read.table.
добавлено автор user1945827, источник
Я использовал это, чтобы собрать все обрывки данных, но слияние сличений и центра не работает очень хорошо.
добавлено автор user1945827, источник

3 ответы

Используя ваши данные, измените их, чтобы указать текстовые поля, содержащие разделитель (получите какой-либо инструмент, который вы использовали для генерации файла, чтобы указать текстовые поля для вас!)

txt <- "Temp Press  Reagent  'Yield A'  'Conversion etc'
degC bar    /g       %        %             
1    2      3        4        5          
6    7      8        9        10
"

этот фрагмент кода ниже читает файл в два этапа

  1. First we read the data, so skip = 2 means skip the first 2 lines
  2. Next we read the data again but only the first two line, this output is then further processed by sapply() where we paste(x, collapse = " ") the strings in the columns of the labs data frame. These are assigned to the names of dat

Вот код:

dat <- read.table(text = txt, skip = 2)
labs <- read.table(text = txt, nrows = 2, stringsAsFactors = FALSE)
names(dat) <- sapply(labs, paste, collapse = " ")

dat
names(dat)

Код, когда запускает:

> dat <- read.table(text = txt, skip = 2)
> labs <- read.table(text = txt, nrows = 2, stringsAsFactors = FALSE)
> names(dat) <- sapply(labs, paste, collapse = " ")
> 
> dat
  Temp degC Press bar Reagent /g Yield A % Conversion etc %
1         1         2          3         4                5
2         6         7          8         9               10
> names(dat)
[1] "Temp degC"        "Press bar"        "Reagent /g"      
[4] "Yield A %"        "Conversion etc %"

В вашем случае вы захотите изменить вызовы read.table() , чтобы указать на файл в вашей файловой системе, поэтому используйте file = "foo.txt" вместо text = txt в фрагменте кода, где "foo.txt" - это имя вашего файла.

Кроме того, если эти заголовки не начинаются в верхней части файла, увеличьте skip до 2 + n , где n - это число строки перед двумя строками заголовка. Вам также нужно добавить skip = n ко второму вызову read.table() , который генерирует labs , где n - это снова количество строк перед строками заголовка.

2
добавлено
«получите любой инструмент, который вы использовали для генерации файла, чтобы процитировать текстовые поля для вас!» Я использовал read.table (file = "clipboard", header = TRUE, sep = "\ t"), чтобы дать мне свою таблицу. Я почесываю голову о том, как я могу скрывать это в текстовой строке. Я только что попробовал, singleString <- paste (readLines ("clipboard"), sep = "\ t", collapse = ""), но это не учитывает разрывы строк. Я думаю, что это всего лишь небольшое количество всего файла, хотя ???
добавлено автор user1945827, источник
Вы не поверили бы этому, но ... пытаясь выяснить, как процитировать в excel, я наткнулся на функцию concatentate, wikihow.com/Concatenate-Text-in-Microsoft-Excel . Я использовал это, чтобы свернуть два заголовка в один в excel, экспортировать как csv и импортировать его в R. (Спасибо за подсказку о том, чтобы уйти от вставки из буфера обмена).
добавлено автор user1945827, источник
@Arun Я пропустил мысль о том, что заголовки не находятся в верхней части файла. Просто увеличьте skip на соответствующее количество строк. Добавлено в ответ.
добавлено автор Gavin Simpson, источник
Тогда не используйте буфер обмена. Как насчет того, как вы копируете/вставляете его в новый лист Excel только с этими данными. Затем экспортируйте лист как CSV и убедитесь, что Excel цитирует текстовые строки (заголовки), в противном случае, если вы используете пробел в качестве разделителя, как R может определить разницу между пространством в заголовке для одной ячейки и пробелом используется для разделения заголовков для смежных ячеек? Более серьезно, copy/paste - not воспроизводимое что-либо; искорените это из вашего рабочего процесса, и вы обнаружите, что вещи несколько проще.
добавлено автор Gavin Simpson, источник

Просто загрузите файл с помощью аргументов read.table (file, header = FALSE, stringsAsFactors = F) . Затем вы можете grep найти позицию.

df <- data.frame(V1=c(sample(10), "Temp", "degC"), 
                 V2=c(sample(10), "Press", "bar"), 
                 V3 = c(sample(10), "Reagent", "/g"), 
                 V4 = c(sample(10), "Yield_A", "%"), 
                 V5 = c(sample(10), "Conversion", "%"), 
                 stringsAsFactors=F)
idx <- unique(c(grep("Temp", df$V1), grep("degC", df$V1)))
df2 <- df[-(idx), ]
names(df2) <- sapply(df[idx, ], function(x) paste(x, collapse=" "))

Здесь, если вы хотите, вы можете преобразовать все столбцы в числовые следующим образом:

df2 <- as.data.frame(sapply(df2, as.numeric))
2
добавлено
Ваш df не похож на данные OPs - у вас есть заголовок, разделенный данными между ними. Я прочитал Q, чтобы указать, что две строки заголовка были смежными только в верхней части файла.
добавлено автор Gavin Simpson, источник
Ну, кто знает? Но их примерные данные показывают заголовок как две непрерывные строки. Это также соответствует modus operandi пользователей Excel с таблицами, расположенными далеко от верхней части листа.
добавлено автор Gavin Simpson, источник

Это должно сработать. При чтении данных вам понадобятся только установочные строкиAsFactors = FALSE.

data <- structure(list(Temp = c("degC", "1", "6"), Press = c("bar", "2", 
"7"), Reagent = c("/g", "3", "8"), Yield.A = c("%", "4", "9"), 
    Conversion = c("%", "5", "10")), .Names = c("Temp", "Press", 
"Reagent", "Yield.A", "Conversion"), class = "data.frame", row.names = c(NA, 
-3L)) # Your data

colnames(data) <-paste(colnames(dados),dados[1,]) # Set new names
data <- data[-1,] # Remove first line

data <- data.frame(apply(data,2,as.real)) # Correct the classes (works only if all collums are numbers)
2
добавлено
Я думаю, что они всегда 1 и 2 от данных, но не из листа excel ... используя skip = NumbersOfLinesToSkip должен работать
добавлено автор Rcoster, источник