Я хочу подробнее остановиться на подходе data.table.
Прежде всего, вы можете прочитать ваши данные, а затем напрямую преобразовать их в объект data.table:
library(data.table)
chromdata <- as.data.table(read.table(text="
genus sp
1 Acosta Acosta_1
2 Aguilera Aguilera_1
3 Acosta Acosta_2
4 Aguilera Aguilera_2",header=TRUE,fill=TRUE,stringsAsFactors=FALSE))
treedata <- as.data.table(read.table(text="
genus sp
1 Acosta Acosta_3
2 Aguilera Aguilera_3
3 Acosta Acosta_4
4 Aguilera Aguilera_4",header=TRUE,fill=TRUE,stringsAsFactors=FALSE))
После этого вам понадобится дополнительный столбец для операции объединения, необходимой для достиженияваш желаемый результат:
chromdata[, N := seq_len(.N), genus]
treedata[, N := seq_len(.N), genus]
Эти строки дают идентификаторы строк в группах.
Наконец, с помощью пакета data.table мы можем объединить эти две таблицы в общих столбцах:
chromdata[treedata, on = c("genus", "N")]
Конечный результат:
genus sp N i.sp
1: Acosta Acosta_1 1 Acosta_3
2: Aguilera Aguilera_1 1 Aguilera_3
3: Acosta Acosta_2 2 Acosta_4
4: Aguilera Aguilera_2 2 Aguilera_4