R - Объединение двух таблиц с особыми условиями - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь объединить две таблицы (файлы CSV) в R с довольно сложными условиями. Каждый файл данных содержит список морских видов и категорические экологические присвоения (в форме присвоения номера 1-6). См. Рисунки для всех заголовков столбцов.

Два файла:

my_data.csv

matt_data.csv

Я хочу сопоставить их по названию рода (заголовок столбца в обеих таблицах). Если имя рода совпадает, я хочу объединить данные.

Особые условия:

1) Если имя рода не совпадает, и оно находится в matt_data, но не в my_data, я хочу, чтобы строка, связанная с родом, была отброшена. my_data содержит только существующие в настоящее время виды, тогда как matt_data содержит некоторые вымершие виды, и я хочу только существующие в настоящее время виды. Если имя рода не совпадает и находится в my_data, но не в matt_data, я хочу, чтобы строка НЕ ​​удалялась.

2) Данный род в matt_data может соответствовать нескольким строкам в my_data, поскольку matt_data классифицируется только по уровню рода, а my_data классифицируется по названию вида. Я хочу, чтобы matt_data соответствовал всем общим родам. Например, скажем, гомо - это род в matt_data (всего одна строка), и у меня есть 10 родов гомо в my_data, я хочу, чтобы информация в строке matt_data была добавлена ​​ко всем 10 родам гомо в my_data.

Дайте мне знать, если что-то из этого не имеет смысла, и я могу уточнить больше.

Ранее я использовал код для объединения другого набора электронных таблиц (скопировано ниже), но в этом случае он не работает. Кроме того, я не верю, что этот код не будет правильно обрабатывать мои особые условия?

setwd("C:/Users/TrevorB/Documents/My Documents/Academics/TCBES/Thesis/IUCN WoRMS")


my_list = read.csv("C:/Users/TrevorB/Documents/My Documents/Spreadsheet Ecological Assignment.csv", header=T)
matt_list = read.csv("C:/Users/TrevorB/Documents/My Documents/matt_data.csv", header=T)

my_list$matt_list <- matt_list$category[match(my_list$genus, matt_list$genus)]

write.csv(my_list, file = 'combined.csv')

1 Ответ

0 голосов
/ 07 февраля 2020

Есть несколько способов сделать это:

base R:

merge(my_list, matt_list, by = 'genus', all.x = T)

plyr:

join(my_list, matt_list, by = 'genus', type = 'left')

dplyr:

left_join(my_list, matt_list, by = 'genus')

Я лично предпочитаю базу R, где это возможно, но plyr не будет переставлять ваши ряды, что приятно.

Редактировать:

Вы можете удалить аргумент by для сопоставления на основе всех совпадающих имен столбцов или добавить другие столбцы для объединения, используя by = c('genus', 'other_col') et c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...