Я хотел бы идентифицировать и отметить повторяющиеся строки на основе 2 столбцов. Я хотел бы сделать уникальный идентификатор для каждого дубликата, чтобы я знал не только, что строка является дубликатом, но и с какой строкой он является дубликатом. У меня есть датафрейм, который выглядит как показано ниже, с некоторыми дублирующимися парами элементов (при посадке и посадке) и другими парами, которые не дублируются. В то время как пары элементов дублируются, информация, которую они содержат, является уникальной (например, одна строка будет иметь значение в Value1 для 1 строки, но не для Value2 и Value 3, вторая или «дублирующая» строка будет иметь номера для Value2 и Value3 просто не Value1)
текущий фрейм данных
value1 value2 value3 fit sit
[1,] "1" NA NA "it1" "it2"
[2,] NA "3" "2" "it2" "it1"
[3,] "2" "3" "4" "it3" "it4"
[4,] NA NA NA "it4" "it3"
[5,] "5" NA NA "it5" "it6"
[6,] NA NA "2" "it6" "it5"
[7,] NA "4" NA "it7" "it9"
код для генерации примера
value1<-c(1,NA,2,NA,5,NA,NA)
value2<-c(NA,3,3,NA,NA,NA, 4)
value3<-c(NA,2,4,NA,NA,2, NA)
fit<-c("it1","it2","it3","it4", "it5", "it6","it7")
sit<-c("it2","it1","it4","it3", "it6", "it5", "it9")
df.now<-cbind(value1,value2,value3, fit, sit)
что я хочу, чтобы преобразовать его в кадр данных, который выглядит следующим образом:
желаемый кадр данных
val1 val2 val3 it1 it2
[1,] "1" "3" "2" "it1" "it2"
[2,] "2" "3" "4" "it3" "it4"
[3,] "5" NA "2" "it5" "it6"
[4,] NA "4" NA "it7" "it9"
Я думал о том, чтобы сделать следующие шаги: 1. создать новые переменные, используя подгонку и сидеть с самым низким и самым высоким предметами, чтобы идентифицировать дублирующиеся пары 2. идентифицировать дублированные пары предметов 3. использовать ifelse, чтобы выбрать и заполнить уникальную информацию.
Я знаю, как выполнять шаги 1 и 3, но застрял на шаге 2. Я думаю, что мне нужно не просто идентифицировать ИСТИННЫЙ / ЛОЖНЫЙ дубликат, но, возможно, иметь столбец с уникальным идентификатором для каждой пары элементов, такой как эта (там 2 дополнительных строки из-за моего шага 1):
value1 value2 value3 fit sit lit hit dup
[1,] "1" NA NA "it1" "it2" "it1" "it2" 1
[2,] NA "3" "2" "it2" "it1" "it1" "it2" 1
[3,] "2" "3" "4" "it3" "it4" "it3" "it4" 2
[4,] NA NA NA "it4" "it3" "it3" "it4" 2
[5,] "5" NA NA "it5" "it6" "it5" "it6" 3
[6,] NA NA "2" "it6" "it5" "it5" "it6" 3
[7,] NA "4" NA "it7" "it9" "it7" "it9" NA
Я не уверен, как это сделать.
То, что я прошу, это либо помощь с шагом 2, либо, возможно, есть лучший способ решить ее, чем шаги, которые я описал.
Используйте
!duplicated()
послеsort
ing.источник
Используя
melt/dcast
изdata.table
данные
источник
Другой
data.table
вариант:вывод:
источник
Вот моя попытка использования data.table. Ваши данные называются
mydf
. Сначала я отсортировалfit
иsit
для каждой строки и создал новую переменнуюgroup
. Затем для каждой группы я отсортировал значения в трех столбцах значений (т. Е. Value1, value2 и value3). Наконец, я извлек первую строку для каждой группы.ДАННЫЕ
источник
Это также может быть сделано
tidyr
сpivot_longer
помощью вvalues_drop_na = TRUE
сочетании сpivot_wider
:Данные
источник