Chciałbym zidentyfikować i oznaczyć zduplikowane wiersze na podstawie 2 kolumn. Chciałbym utworzyć unikalny identyfikator dla każdego duplikatu, więc wiem nie tylko, że wiersz jest duplikatem, ale z którym wierszem jest duplikatem. Mam ramkę danych, która wygląda jak poniżej z niektórymi zduplikowanymi parami elementów (przy dopasowaniu i usiąść) i innymi parami, które nie są duplikowane. Podczas gdy pary pozycji są duplikowane, zawarte w nich informacje są unikalne (np. Jeden wiersz będzie miał wartość w wartości 1 dla 1 wiersza, ale nie ma wartości 2 i wartości 3, drugi lub „duplikat” wiersza będzie zawierał liczby dla wartości 2 i wartości 3 tylko nie wartość1)
aktualna ramka danych
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"
kod do wygenerowania przykładowej ramki danych
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)
chcę przekonwertować go na ramkę danych, która wygląda następująco:
pożądana ramka danych
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"
Myślałem o zrobieniu następujących kroków: 1. utwórz nowe zmienne przy użyciu fit i usiądź przy najniższym i najwyższym elemencie, aby zidentyfikować zduplikowane pary 2. zidentyfikuj zduplikowane pary przedmiotów 3. użyj ifelse, aby wybrać i wypełnić niepowtarzalne informacje.
Wiem, jak wykonać kroki 1 i 3, ale utknąłem na kroku 2. Myślę, że muszę nie tylko zidentyfikować PRAWDA / FAŁSZ, ale może mieć kolumnę z unikalnym identyfikatorem dla każdej pary takich elementów (tam są 2 dodatkowe wiersze z powodu mojego kroku 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
Nie jestem pewien jak to zrobić.
Proszę o pomoc w kroku 2 lub może istnieje lepszy sposób na rozwiązanie tego problemu niż kroki, które nakreśliłem.
Użyj
!duplicated()
posort
ing.źródło
Korzystanie
melt/dcast
zdata.table
dane
źródło
Inna
data.table
opcja:wynik:
źródło
Oto moja próba użycia data.table. Twoje dane są nazywane
mydf
. Po pierwsze, sortowanefit
isit
dla każdego wiersza i stworzył nową zmiennągroup
. Następnie dla każdej grupy posortowałem wartości w trzech kolumnach wartości (tj. Wartość1, wartość2 i wartość3). Na koniec wyodrębniłem pierwszy wiersz dla każdej grupy.DANE
źródło
Można to również zrobić za pomocą
tidyr
spivot_longer
wvalues_drop_na = TRUE
połączeniu zpivot_wider
:Dane
źródło