У меня возникают проблемы при попытке объединить два фрейма данных. Вот пример:
Number <- c("1", "2", "3")
Letter <- factor(c("a", "b", "c"))
map <- data.frame(Number, Letter, row.names = c("Belgium", "Italy", "Senegal"))
Это мой первый фрейм данных под названием «карта», он выглядит так:
Number Letter
Belgium 1 a
Italy 2 b
Senegal 3 c
И если я попытаюсь выбрать по строке и столбцу, у меня нет проблем:
map["Belgium", "Number"]
[1] "1"
Здесь у меня есть второй фрейм данных под названием «календарь»:
Month <- c("January", "February", "March")
calendar <- data.frame(Month, row.names = c("Belgium", "Italy", "Senegal"))
Это выглядит так:
Month
Belgium January
Italy February
Senegal March
Проблема возникает, когда я пытаюсь объединить оба фрейма данных:
map.amp = merge(map, calendar, by = 0)
Row.names Number Letter Month
1 Belgium 1 a January
2 Italy 2 b February
3 Senegal 3 c March
Теперь, когда я пытаюсь выбрать ячейку, используя строки и столбцы, результат всегда NA
map.amp["Italy", "Month"]
[1] NA
map.amp["Belgium", "Number"]
[1] NA
Как я могу объединить оба фрейма данных, чтобы продолжать использовать такую функцию выбора?
map.amp[map.amp$Row.names =='Italy', 'Month']
Теперь будет работать, поскольку row.names теперь также является столбцом
Это не сработает, так как вам нужно снова ссылаться на имя data.frame — map.amp[map.amp$Row.names =='Italy', 'Month']
Вы должны переустановить имена строк:
row.names(map.amp) <- map.amp$Row.names
Оно работает! Но когда я печатаю фрейм данных «map.amp», я получаю повторяющиеся имена строк в двух разных столбцах. Как я мог предотвратить это?
Удалите лишний столбец с помощью map.amp$Row.names <- NULL
Вы можете использовать ответ в комментарии @thelatemail. Или используйте
subset(map.amp, Row.names =='Italy')[[ 'Month']] # first get matching rows but them narrow to named column.
или
subset(map.amp, Row.names =='Italy', 'Month') # third argument is for column selection
Если вы хотите продолжать использовать эти имена строк, вы должны установить столбец Row.names
обратно в имена строк. tibble::column_to_rownames
хороший вариант для этого:
map.amp <- merge(map, calendar, by = 0) %>% tibble::column_to_rownames(var = "Row.names")
Связанный старый пост — Как объединить кадры данных по имени строки без добавления столбца «Row.names»?