У меня есть два фрейма данных и два столбца идентификаторов, теперь я хочу проверить, доступен ли id1 в df1 в df2 id2, новый столбец mutate для дублирования существует, но мой код не работает, что я делаю неправильно ..??
также я даю пользователю входной параметр, чтобы указать имена столбцов для проверки
df1 <- data.frame(ID1= c("EMT1","EMT2","EMT3","EMT4","EMT5","EMT6","EMT7","EMT8","EMT9","EMT10","EMT11","EMT12","EMT13","EMT14","EMT15","EMT16","EMT17","EMT18","EMT19","EMT20","EMT21","EMT22","EMT23","EMT24","EMT25","EMT25","EMT27"))
df2 <- data.frame(ID2= c("EMT10","EMT10","EMT10","EMT8","EMT8","EMT8","EMT6","EMT10","EMT6","","EMT6","EMT6","EMT5","EMT5","EMT5","EMT5","EMT5","EMT5","EMT5","EMT4","EMT4","EMT4","EMT4","EMT23","EMT32","EMT241","EMT51"))
empid_new = "ID1"
empid_old = "ID2"
uniqu_emp <- df2 %>% select(empid_old) %>% distinct()
df1 <- df1 %>% mutate(`dupe id` = ifelse((df1[[empid_new]] %in% uniqu_emp)== TRUE, "duplicate exist",""))
Поскольку вы используете dplyr
, вы можете ссылаться на фрейм данных с помощью .data
.
distinct
возвращает фрейм данных для сравнения с %in%
вам нужен вектор.
library(dplyr)
uniqu_emp <- df2 %>% distinct(.data[[empid_old]]) %>% pull()
df1 %>%
mutate(`dupe id` = ifelse(.data[[empid_new]] %in% uniqu_emp,
"duplicate exist",""))
# ID1 dupe id
#1 EMT1
#2 EMT2
#3 EMT3
#4 EMT4 duplicate exist
#5 EMT5 duplicate exist
#6 EMT6 duplicate exist
#7 EMT7
#8 EMT8 duplicate exist
#9 EMT9
#10 EMT10 duplicate exist
#11 EMT11
#12 EMT12
#....
#....
Я не думаю, что что-то изменится, если первое значение будет NA
или пустым. Это должно работать так же. Вы присвоили результат обратно данным df1 <- df1 %>% mutate(`dupe id`....
? Кроме того, что вы подразумеваете под не работает? Любое сообщение об ошибке или неправильный вывод? Работает ли он должным образом для данных, которыми вы поделились?
да, я возвращаю результат к данным. на самом деле не показывает никаких ошибок, но столбец mutate отображается как пустой, не показывая никаких дубликатов. что может быть причиной, я также проверил, что класс (персонаж) такой же
Проверьте, есть ли пробелы. Сделайте df1[] <- lapply(df1, trimws)
и df2[] <- lapply(df2, trimws)
, чтобы удалить их, и повторите попытку. Можете ли вы привести пример, где мы можем воспроизвести эту ошибку?
пробелы уже не проверены. фрейм данных очень большой, поэтому я попытался привести пример в своем вопросе.
Работает ли ответ так, как ожидалось, для общего примера?
да, он работает так же правильно, но для моей фактической базы данных, почему он не работает, в чем может быть причина...??
Хм... не уверен в этом. Может быть, если вы поделитесь некоторыми строками вашего фактического набора данных, на которых мы сможем воспроизвести неправильные результаты, это будет полезно для отладки.
если первая ячейка моего df1 всегда будет пустой, тогда с этим возникнут какие-либо проблемы ...? я спрашиваю об этом, потому что в моем исходном фрейме данных это все еще не работает, я проверил все, например, пробел и т. д., все в порядке, только дело в том, что моя первая ячейка пуста (NA) в DF1