2013-08-13 23 views
10

Potrzebuję scalić dwie ramki danych o różnych rozmiarach. Większy (df1) ma kolumnę z kilkoma powtarzającymi się wartościami (licto), krótszy (df2) ma kolumnę licto, ale jej wartości nie są powtarzane. df2 ma również kolumnę ID. Potrzebuję nowej kolumny w df1 z identyfikatorami w df2, powtarzanej według powtarzanych wartości w licto. Poniższy przykład prawdopodobnie uczyni go jaśniejszym.Scalanie ramek danych o różnych rozmiarach i powtarzanie wartości

df1<-data.frame(licfrom=c(15470,16307,17121,15350,16982,17182,20319,16727,16946,16262,16605, 
       16607,15924,15399,15404,16739,16839,16842,16899,16157,15399), 
     licto=c(17121,17121,17121,16982,16982,16982,16982,16946,16946,16262,16607, 
      16607,15924,16839,16839,16839,16839,16839,16839,16157,15399)) 

.

df2<-data.frame(licto=c(17121,16982,16946,16607,15924,16839,16157,15399), 
     fisherID=c(160,760,770,406,106,2196,17323,2441)) 

moich ramek danych wygląda następująco:

df1     df2 
licfrom licto  licto fisherID 
15470 17121  17121 160 
16307 17121  16982 760 
17121 17121  16946 770 
15350 16982  16262 947 
16982 16982  16607 406 
17182 16982  15924 106 
20319 16982  16839 2196 
16727 16946  16157 17323 
16946 16946  15399 2441 
16262 16262   
16605 16607   
16607 16607   
15924 15924   
15399 16839   
15404 16839   
16739 16839   
16839 16839   
16842 16839   
16899 16839   
16157 16157   
15399 15399 

I moja ostatnia ramka danych powinno być tak:

licfrom licto fisherID 
15470 17121 160 
16307 17121 160 
17121 17121 160 
15350 16982 760 
16982 16982 760 
17182 16982 760 
20319 16982 760 
16727 16946 770 
16946 16946 770 
16262 16262 947 
16605 16607 406 
16607 16607 406 
15924 15924 106 
15399 16839 2196 
15404 16839 2196 
16739 16839 2196 
16839 16839 2196 
16842 16839 2196 
16899 16839 2196 
16157 16157 17323 
15399 15399 2441 

Każda pomoc będzie mile widziane, jak spędziłem kilka godzin próbuję scalić, kiedy potrzebuję. Użyłem merge i %in% bez powodzenia. Dzięki!

Odpowiedz

7

Można to zrobić po prostu za pomocą funkcji merge().

merge(df1,df2,sort=FALSE) 

    licto licfrom fisherID 
1 17121 15470  160 
2 17121 17121  160 
3 17121 16307  160 
4 16982 15350  760 
5 16982 16982  760 
6 16982 20319  760 
7 16982 17182  760 
8 16946 16727  770 
9 16946 16946  770 
10 16607 16605  406 
11 16607 16607  406 
12 15924 15924  106 
13 16839 15399  2196 
14 16839 15404  2196 
15 16839 16739  2196 
16 16839 16839  2196 
17 16839 16842  2196 
18 16839 16899  2196 
19 16157 16157 17323 
20 15399 15399  2441 
+0

Było to prostsze niż myślałem, po prostu dodając argument sortowania to działało. Wielkie dzięki. – Rafael

3

Aby być bardziej jednoznaczne z opcji, warto spróbować tej

merge(df1, df2, by = "licto", all = TRUE, sort = FALSE) 
+1

To jest bardziej komentarz do poprzedniej odpowiedzi niż nowa odpowiedź. – Thomas

+0

Wielkie dzięki, ta opcja też zadziałała. – Rafael

Powiązane problemy