объединение двух фреймов данных на основе одного столбца без дублирования строк и сохранения большего количества данных - PullRequest
0 голосов
/ 05 октября 2018

Моя цель - объединить два больших фрейма данных на основе столбца genus, но с особым условием не дублировать строки (не решается с первой попытки);а также сохраняя больше информации из обоих фреймов данных (не решается во второй попытке), просмотрите желаемый вывод:

chromdata <- read.table(text="
 genus sp
1      Acosta       Acosta_1
2    Aguilera     Aguilera_1
3      Acosta       Acosta_2
4    Aguilera     Aguilera_2
5       other              1   # EDIT: new rows    
6       other              2",header=TRUE,fill=TRUE,stringsAsFactors=FALSE)

treedata <- read.table(text="
 genus sp
1      Acosta       Acosta_3
2    Aguilera     Aguilera_3
3      Acosta       Acosta_4
4    Aguilera     Aguilera_4
5       other              3",header=TRUE,fill=TRUE,stringsAsFactors=FALSE)

#First try
merge(chromdata,treedata, by="genus", all=F)

#Second try
chromdata$sp2<-treedata$sp[match(chromdata$genus, treedata$genus)]
chromdata
     genus         sp        sp2
1   Acosta   Acosta_1   Acosta_3
2 Aguilera Aguilera_1 Aguilera_3
3   Acosta   Acosta_2   Acosta_3 #Acosta_4 missing
4 Aguilera Aguilera_2 Aguilera_3 # Aguilera_4 missing
5    other          1          3
6    other          2          3 

Желаемый вывод:

     genus         sp        sp2
1   Acosta   Acosta_1   Acosta_3
2 Aguilera Aguilera_1 Aguilera_3
3   Acosta   Acosta_2   Acosta_4
4 Aguilera Aguilera_2 Aguilera_4
5    other          1          3 # EDIT: new rows
6    other          2          3

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Я хочу подробнее остановиться на подходе 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
0 голосов
/ 05 октября 2018

Вы можете добавить еще один столбец для объединения:

library(data.table)
merge(
  transform(chromdata, r = rowid(genus)), 
  transform(treedata, r = rowid(genus)), 
  by=c("r", "genus")
)

  r    genus       sp.x       sp.y
1 1   Acosta   Acosta_1   Acosta_3
2 1 Aguilera Aguilera_1 Aguilera_3
3 2   Acosta   Acosta_2   Acosta_4
4 2 Aguilera Aguilera_2 Aguilera_4

Вы также можете получить rowid, например ave(genus, genus, FUN = seq_along) или , многими другими способами , если вы не хотите загружать данные.таблица.

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