Функция Tolower и объединение двух кадров данных - PullRequest
0 голосов
/ 04 мая 2018

У меня есть 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 и не нашел свой ответ.

1 Ответ

0 голосов
/ 12 июля 2018

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

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
...