Я пытаюсь удалить повторяющиеся данные идентификатора в моем фрейме данных
buying<-buy_nobuy[duplicated(buy_nobuy[,1])==F,]
после этого он говорит мне, что не осталось дублированных данных
length(buying[duplicated(buying[,1])==TRUE,1])
[1] 0
но когда я проверял вручную в глобальной среде, я обнаружил, что на самом деле, все еще существуют дублирующиеся данные (например, на картинке)
И я проверяю, что произойдет, если я проверю строки с одинаковым идентификатором:
> buying[9,1]==buying[71,1]
[1] FALSE
Кажется нелепым. Я предполагаю, что это может быть какая-то проблема с типом данных?
кто знает как это решить?
кстати, я читаю фрейм данных в виде символа, так как идентификатор не может быть прочитан как числовой или он будет представлен в экспоненциальном виде и потеряет реальный идентификатор
buy_nobuy <- read.csv('community_achievement_buying.csv',colClasses= c(Id = "character"))
Я ОБНАРУЖИЛ, что, как вы сказали, в строке 71 есть дополнительное место.
> print(buying[9,1])
[1] 76561198321932950\t
73039 Levels: 76561197960272112\t ...
> print(buying[71,1])
[1] 76561198321932950\t\t
73039 Levels: 76561197960272112\t
Если простая модификация, подобная приведенной выше, не работает, вам нужно будет предоставить фактические данные (возможно, только эти две строки), чтобы мы могли протестировать и проверить себя. Просто изображения данных вообще не будут полезны.
Часто эти проблемы возникают из-за начальных или конечных пробелов.
Голосование за закрытие как невоспроизводимый пример. Чтобы запросить отмену закрытия, выведите сообщение dput( buying[c(9,71),1])
как редактировать.
Сохраняйте согласованные имена фреймов данных. Вы дедуплицируете фрейм данных с именем buy_nobuy
и находите дубликаты в другом фрейме данных с именем buying
. Может быть, это совершенно разные фреймы данных? Может быть, вы создаете дубликат при создании buying
?
@joran хорошо, StackOverflow, похоже, не предоставляет функцию вложения.
@42- Я не совсем понимаю смысл голосования за закрытие. ну, данные имеют 100 000 строк и считываются из csv, так что извините за отсутствие воспроизводимого примера. Но спасибо за ваш комментарий, так что я могу понять, что могу распечатать две строки и обнаружил, что в строке71 есть дополнительный / t, как они предложили DSGym и Джеймс. Поправлю пост, спасибо.
На самом деле это НЕ дополнительный пробел, а скорее «дополнительный» символ табуляции. ОДИН из этих элементов имеет одну вкладку, а другой - 2 вкладки. Итак, я полагаю, что теперь вы предоставили достаточно информации для полной диагностики лежащей в основе патологии, несмотря на вашу очевидную неспособность следовать четким указаниям. И это показывает, что предположение, предложенное в принятом ответе, было не совсем правильным.
Не зря! Мы не хотим и не нуждаемся в огромных наборах данных, но создание небольшого воспроизводимого примера — важный первый шаг как для самостоятельного устранения проблемы, так и для обращения за помощью в Интернете. Но это требует некоторых усилий и исследований с вашей стороны. Поиск в Google «r воспроизводимый пример», скорее всего, приведет вас к вопросу SO с МНОЖЕСТВОМ советов о том, как это сделать.
@42- спасибо. Я думаю, что в литературе значение пробела и табуляции имеет совершенно одно и то же значение, поскольку все они могут рассматриваться как разделенный символ, и это действительно указывает на то, что может быть что-то другое, кроме того, что мы можем «видеть» в окне RStudio, поэтому я согласился это как подходящий ответ. Извините, что не знаю слишком много точной терминологии
@joran спасибо, попробую в следующий раз. поскольку эта проблема кажется решенной после того, как я распечатаю две строки. Я новичок в R, кодах или терминологии, спасибо за предложения.
data <- data.frame(
id = c("123456789", "123456789 "),
buy = c(1,1)
)
Как уже упоминалось, векторы символов часто имеют пробелы в конце => Вы не увидите этого в средстве просмотра данных R Studio. Есть простой способ определить, действительно ли эти значения совпадают: попробуйте charToRaw
, чтобы увидеть, совпадают ли оба идентификатора.
apply(data[1], 1, charToRaw)
[[1]]
[1] 31 32 33 34 35 36 37 38 39
[[2]]
[1] 31 32 33 34 35 36 37 38 39 20
data$id <- trimws(data$id) # Thanks @ Mako212
apply(data[1], 1, charToRaw)
[,1] [,2]
[1,] 31 31
[2,] 32 32
[3,] 33 33
[4,] 34 34
[5,] 35 35
[6,] 36 36
[7,] 37 37
[8,] 38 38
[9,] 39 39
В базе R есть trimws()
, не уверен, что здесь есть необходимость в stringr
не знал о такой функции, если честно, спасибо :-)
Попробуйте:
buy_nobuy<-buy_nobuy[!duplicated(buy_nobuy[,1]),]