rbind.data.frames, сохраняющий уникальные строки в соответствии с одним столбцом R

#r #filter #dplyr #intersect #rbind

#r #Фильтр #dplyr #пересекаются #rbind

Вопрос:

У меня есть два разных фрейма данных, в которых показаны результаты опроса за 2014 и 2015 годы, оба с одинаковыми столбцами. Я хочу добавить уникальные строки (т.е. ID-коды) с 2014 года до фрейма данных с 2015 года.

Проблема в том, что все строки уникальны (поскольку имеется 23 столбца), но я хочу добавить только строки, содержащие уникальный идентификационный код (один из столбцов), то есть людей, которые ответили на вопросник 2014, но не 2015.

С помощью rbind.data.frames удается создать «фрейм данных 2014-2015», но затем я хочу стереть строки, содержащие идентификационные коды, которые отвечали как на 2014, так и на 2015 год, и сохранить их с 2015 года.

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

1. Гораздо проще ответить на вопрос, если вы предоставите воспроизводимые примеры данных, например, использование dput() и ожидаемый результат, а не много текста. И всем нравится, когда вы включаете какой-то код, который вы уже пробовали до сих пор.

Ответ №1:

Если я правильно вас понимаю:

 df2014<-structure(list(ID = 1:7, V1 = structure(c(1L, 1L, 1L, 2L, 2L, 
3L, 1L), .Label = c("A", "B", "C"), class = "factor"), V2 = structure(c(2L, 
1L, 2L, 1L, 2L, 3L, 1L), .Label = c("A", "B", "C"), class = "factor"), 
V3 = structure(c(1L, 1L, 2L, 3L, 3L, 3L, 1L), .Label = c("A", 
"B", "C"), class = "factor")), .Names = c("ID", "V1", "V2", 
"V3"), class = "data.frame", row.names = c(NA, -7L))

df2015<-structure(list(ID = 4:10, V1 = structure(c(1L, 1L, 1L, 2L, 2L, 
3L, 1L), .Label = c("A", "B", "C"), class = "factor"), V2 = structure(c(2L, 
1L, 2L, 1L, 2L, 3L, 1L), .Label = c("A", "B", "C"), class = "factor"), 
V3 = structure(c(1L, 1L, 2L, 3L, 3L, 3L, 1L), .Label = c("A", 
"B", "C"), class = "factor")), .Names = c("ID", "V1", "V2", 
"V3"), class = "data.frame", row.names = c(NA, -7L))

library(dplyr)
rbind(dplyr::filter(df2014, !ID %in% intersect(df2014$ID, df2015$ID)), df2015)
  

Результирующий фрейм данных

     ID V1 V2 V3
1   1  A  B  A
2   2  A  A  A
3   3  A  B  B
4   4  A  B  A
5   5  A  A  A
6   6  A  B  B
7   7  B  A  C
8   8  B  B  C
9   9  C  C  C
10 10  A  A  A
  

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

1. Спасибо Рафаэлю Ли. Наверное, я смутил вас своим длинным текстом, я должен был сам вставить пример данных, извините за это! Однако ваш способ привел к удалению идентификатора 4-7 для меня. Я хотел сохранить идентификатор 4-7, но только их с 2015 года, то есть. Только один ответ на идентификатор, и если один и тот же идентификатор был отправлен в ответах как в 2014, так и в 2015 годах, сохраните самый новый. Спасибо!

2. Приношу свои извинения за неправильную интерпретацию ваших требований. Я отредактировал код.

3. Но это была моя вина, Рафаэль. Мой английский не самый лучший. Попробовал ваш новый код, и все сработало отлично. Впоследствии попробовал несколько случайных выборок, которые доказали, что во фрейм данных 2015 года были добавлены только уникальные ответы 2014 года. Большое спасибо, Рафаэль!

Ответ №2:

Используйте data.table и unique :

 library(data.table)
library(magrittr)

# Example data
set.seed(1)
x2014 <- data.table(ID = 1:10, y = rnorm(10))
x2015 <- data.table(ID = 1:10   5, y = rnorm(10)) 

# So IDs 6-10 are duplicate

rbind(x2015, x2014) %>%
  setkey(ID) %>%
  unique
  

Обратите внимание, что порядок rbind важен. 2015 должно быть первым, если вы хотите, чтобы это была таблица, из которой хранятся строки.

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

1. Спасибо, Хью, я думаю, ваш метод сработает. Но я действительно не понимаю, что означает и делает %>%? Пробовал справочную функцию R-Studios без какого-либо результата. В Google я обнаружил, что %>% вызывается функцией канала, но не так, как это работает. Что писать внутри unique(), фрейма данных или просто «ID» или «dataframe $ ID? Заранее спасибо!

2. См . cran.r-project.org/web/packages/magrittr/vignettes /… для ознакомления с магриттром %>% или «трубой». Но %>% это просто для того, чтобы сделать код более читаемым — хотя, похоже, это было контрпродуктивно! Я мог бы переписать его без %>% ; однако, я искренне верю, что вам было бы более поучительно узнать, %>% а затем попытаться понять этот метод.

3. Спасибо за ссылку, думаю, что позже мне это поможет. Спасибо за вашу помощь и хорошего вам!