#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. Спасибо за ссылку, думаю, что позже мне это поможет. Спасибо за вашу помощь и хорошего вам!