Объединение фреймов данных с пропущенными значениями в R

#r #merge #dataframe

#r #слияние #фрейм данных

Вопрос:

Код для получения фреймов данных:

 rat_all = structure(list(frequency = c(37L, 31L, 14L, 11L, 2L, 3L), isoforms = 8:13,      
    type = structure(c("rat_all", "rat_all", "rat_all", "rat_all",              
    "rat_all", "rat_all"), .Dim = c(6L, 1L))), .Names = c("frequency",          
"isoforms", "type"), row.names = 8:13, class = "data.frame")

rat_ensembl = structure(list(frequency = c(17L, 8L, 20L), isoforms = 8:10,                    
    type = structure(c("rat_ensembl", "rat_ensembl", "rat_ensembl"              
    ), .Dim = c(3L, 1L))), .Names = c("frequency", "isoforms",                  
"type"), row.names = 8:10, class = "data.frame") 
  

У меня есть два фрейма данных:

   frequency isoforms        type                                               
8         17        8 rat_ensembl                                               
9          8        9 rat_ensembl                                               
10        20       10 rat_ensembl  
  

и

    frequency isoforms    type                                                   
8         37        8 rat_all                                                   
9         31        9 rat_all                                                   
10        14       10 rat_all                                                   
11        11       11 rat_all                                                   
12         2       12 rat_all                                                   
13         3       13 rat_all   
  

Я хотел бы объединить их в один фрейм данных, но также включить отсутствующие
isoforms записи, которые появляются в rat_all фрейме данных, но не в rat_ensembl
фрейм данных. Итак, я бы хотел, чтобы на выходе был объединенный фрейм данных, как если бы я повторно связал
два фрейма данных, но дополненные:

 11         0       11 rat_ensembl
12         0       12 rat_ensembl
13         0       13 rat_ensembl
  

Я думал, что смогу сделать это с помощью merge, но в итоге получается огромная путаница, которую я должен размотать, которую я могу в конечном итоге преобразовать в правильный формат, но это не очень хорошее решение, если
Я хотел сделать это для четырех или пяти разных «типов» одновременно. Чего мне не хватает? Спасибо!

Для ясности я хочу получить окончательный фрейм данных, который выглядит как:

       frequency isoforms        type                                               
1         17        8 rat_ensembl                                               
2          8        9 rat_ensembl                                               
3         20       10 rat_ensembl                                                   
4         37        8 rat_all                                                   
5         31        9 rat_all                                                   
6         14       10 rat_all                                                   
7         11       11 rat_all                                                   
8          2       12 rat_all                                                   
9          3       13 rat_all   
10         0       11 rat_ensembl
11         0       12 rat_ensembl
12         0       13 rat_ensembl
  

Я могу заставить его делать то, что я хочу, если я использую:

 z = merge(rat_ensembl, rat_all, by.x="isoforms", by.y="isoforms", all.y=TRUE)
   isoforms frequency.x      type.x frequency.y  type.y                         
7         7          44 rat_ensembl          69 rat_all                         
8         8          17 rat_ensembl          37 rat_all                         
9         9           8 rat_ensembl          31 rat_all                         
10       10          20 rat_ensembl          14 rat_all                         
11       11          NA        <NA>          11 rat_all                         
12       12          NA        <NA>           2 rat_all                         
13       13          NA        <NA>           3 rat_all                         
14       14          NA        <NA>           1 rat_all            
  

Тогда теоретически я мог бы выделить isoforms , frequency.x type.x столбцы и
исправьте их, чтобы они были правильными для каждого из rat_ensembl и rat_all , а затем rbind эти
фреймы данных объединены, но, похоже, должно быть что-то, что просто обрабатывает это напрямую.

Комментарии:

1. что вы пробовали с merge? Какие общие столбцы вы хотите объединить? частота, изоформы, тип? Все вышеперечисленное? После того, как вы определили общие столбцы, необходимо указать, требуется ли вам внутреннее, левое, правое или внешнее объединение, указав аргументы «все». Кроме того, можете ли вы обновить свой вопрос фрагментом кода, который люди могут вставить в свои сеансы R? используйте dput() и вставьте содержимое в свой вопрос.

2. Спасибо за предложение dput, это очень полезно. Я добавил дополнительную информацию к сообщению.

Ответ №1:

может быть, вы хотите что-то вроде этого

 z <- merge(rat_ensembl, rat_all, all = TRUE)

iso_diff <- setdiff(rat_all$isoforms, rat_ensembl$isoforms)

augmented <- data.frame(frequency = 0, isoforms = iso_diff, type = "rat_ensembl", stringsAsFactors= FALSE)

df_all <- rbind(z, augmented)
  

Надеюсь, это поможет.

Комментарии:

1. Привет, Изельцер, похоже, это просто дает мне тот же результат, что и повторная привязка двух фреймов данных вместе. Я ищу какой-нибудь способ дополнить это некоторыми данными, которые отсутствуют в одном из фреймов данных. Я обновил свой пост, чтобы он был немного более понятным. Спасибо!

2. @rory, я только что обновил свой anwser, чтобы включить то, что ты действительно хотел. Я не знаю, есть ли более простой способ для этого. Если кто-то знает об этом, пожалуйста, опубликуйте это.

3. Спасибо Изельцеру, функция setdiff для меня новая. Я думаю, что это решение подойдет мне, но оно работает только в том случае, если я точно знаю, что все различия обусловлены одним условием. Однако в моем случае это так. Спасибо!