функция tolower и объединение двух кадров данных

У меня есть 3 фрейма данных, которые называются соответственно: barometre2013, barometre2016, barometre2018.

Я уже объединял barometre2018 и barometre2016 вот так:

baro1618 <- merge(barometre2016, barometre2018, all = TRUE)

Все было хорошо, у меня все строки двух фреймов данных и одинаковые имена столбцов объединены в один со всеми строками двух фреймов данных. Именно то, что я хотел.

Объединенная таблица выглядит так:

names(baro1618)
    [1] "q0qc"           "regio"          "sexe"           "age"            "langu"          "q1a_1"          "q1a_2"          "q1a_3"          "q1a_4"          "q1a_5"         
    [11] "q1a_6"          "q1a_7"          "q1a_8"          "q1a_9"          "q1a_10"         "q1b_1"          "q1b_2"          "q1b_3"          "q1b_4"          "q1b_5"         
    [21] "q1b_6"          "q1b_7"          "q1b_8"          "q1b_9"          "q1b_10"

ТЕПЕРЬ, моя проблема начинается здесь.

Я хочу объединить baro1618 с barometre2013, но перед этим мне нужно перевести все имена столбцов в нижний регистр, потому что, когда я пытался объединить без этого, столбцы barometre2013 в верхнем регистре, которые имеют то же имя в нижнем регистре baro1618, не были объединены .

df barometre2013 выглядит так:

names(barometre2013)
    [229] "POND"        "Q1A_1"       "Q1A_2"       "Q1A_3"       "Q1A_4"       "Q1A_5"       "Q1A_6"       "Q1A_7"       "Q1A_8"       "Q1A_9"       "Q1A_10"      "Q1B_1"      
    [241] "Q1B_2"       "Q1B_3"       "Q1B_4"       "Q1B_5"       "Q1B_6"       "Q1B_7"       "Q1B_8"       "Q1B_9"       "Q1B_10"      "Q5A_1"       "Q5A_2"       "Q5A_3"  

Итак, я попробовал два решения для нижнего регистра (оба работают):

barometre2013 <- setnames(barometre2013, tolower(names(barometre2013)))

colnames(barometre2013) <- tolower(colnames(barometre2013))

Результат:

[229] "pond"        "q1a_1"       "q1a_2"       "q1a_3"       "q1a_4"       "q1a_5"       "q1a_6"       "q1a_7"       "q1a_8"       "q1a_9"       "q1a_10"      "q1b_1"      
[241] "q1b_2"       "q1b_3"       "q1b_4"       "q1b_5"       "q1b_6"       "q1b_7"       "q1b_8"       "q1b_9"       "q1b_10"      "q5a_1"       "q5a_2"       "q5a_3"  

НО, когда я пытался объединиться вот так:

baro1118 <- merge(baro1618, barometre2013, all = TRUE)

Это дает мне эту ошибку:

Error in fix.by(by.x, x) : 'by' must specify a uniquely valid column

Я не понимаю, почему это работало в первом примере, а не во втором. Я не могу указать какие-либо столбцы, потому что у меня СЛИШКОМ много столбцов имен, которые совпадают, и много несовпадающих.

Должна быть возможность не указывать правильно?

Кроме того, я хочу сохранить все имена столбцов, совпадающие и не совпадающие с обоими df.

Извините за это длинное объяснение, но мне действительно нужен ответ, и я прочитал много вопросов и ответов по SO и не нашел своего ответа.


person Marine Leroi    schedule 04.05.2018    source источник
comment
Я забыл указать, что когда я не выполняю функцию tolower раньше, она фактически объединяется, не выдавая мне ошибки !!   -  person Marine Leroi    schedule 04.05.2018
comment
Не думаю, что у нас достаточно информации, чтобы дать вам четкие инструкции. Перед слиянием нужно будет увидеть str() в обоих фреймах данных, чтобы узнать, как выглядят имена столбцов и структура каждого из них. Имейте в виду, что выполнение setnames(barometre2013, tolower(names(barometre2013))) на самом деле ничего не делает. Вам нужно будет присвоить значение обратно barometre2013, если вы хотите, чтобы результат был устойчивым.   -  person IRTFM    schedule 04.05.2018
comment
Я отредактировал свой вопрос и исправил имена наборов. Большое вам спасибо за ваше время !   -  person Marine Leroi    schedule 04.05.2018
comment
Мне кажется, что вы пытаетесь объединить слишком много столбцов одновременно. Вы явно не даете мне полную картину из str(), так как эти номера столбцов находятся в 200-х!!!! Разве в этих фреймах данных нет одного (или, может быть, двух) столбцов, которые будут совпадать? Или возможно, что вы действительно хотите выполнить операцию rbind? У них есть названия, предполагающие, что это данные о погоде в разные годы.   -  person IRTFM    schedule 05.05.2018
comment
Точно, это не полная картина моих dfs, потому что у них более 400 столбцов и более 1000 строк в каждой, поэтому сложно показать вам все. Я решил показать вам эту часть, потому что вы можете видеть, что есть несколько столбцов с одинаковыми именами, но один в нижнем регистре, а другой в верхнем регистре. Когда я объединил их оба, эти столбцы не совпали, и это нехорошо для меня, потому что это один и тот же столбец, то есть один и тот же вопрос. Я собираюсь попробовать функцию rbind. Я провел некоторое исследование и обнаружил, что существует функция rbind.fill для dfs, которые не имеют одинакового количества столбцов.   -  person Marine Leroi    schedule 06.05.2018
comment
@42- rbindlist() работал очень хорошо!! Большое спасибо за помощь   -  person Marine Leroi    schedule 08.05.2018
comment
Вы можете написать ответ на свой вопрос. Было бы полезнее, если бы вы начали с включения вывода str() в оба фрейма данных до начала работы, а также разместили str() или вывод head() в окончательных результатах. Не забудьте включить библиотечные вызовы для всех используемых пакетов, поскольку rbindlist на моей машине взято из data.table. Это будет иметь полезный результат в виде повышения вашей репутации до такой степени, что вы сможете комментировать другие сообщения (и, возможно, другие вещи, о которых я забыл). Технически это операция добавления, а не то, что в компьютерном языке известно как слияние.   -  person IRTFM    schedule 08.05.2018
comment
Ок, спасибо за информацию, теперь так и сделаю.   -  person Marine Leroi    schedule 08.05.2018


Ответы (1)


Возможно, стоит попробовать:

baro1118 <- merge(baro1618, barometre2013, all = TRUE, by=intersect(names(baro1618), names(barometre2013))

Это объединяется только по общим столбцам.

При этом ваша догадка об использовании rbind для этого, вероятно, более верна. Если это данные из разных периодов времени, и они не перекрываются, rbind просто наложит их друг на друга. Это не всегда проходит гладко, но вот грубый хак:

# maybe barometre2013 has missing column names
missing.column.names <- setdiff(names(baro1618), names(barometre2013))
barometre2013[, missing.column.names] <- NA

# maybe baro1618 has missing column names
missing.column.names <- setdiff(names(barometre2013), names(baro1618))
baro1618[, missing.column.names] <- NA
person Liudvikas Akelis    schedule 12.07.2018