2016-12-11 2 views
0

meine df ist untermerge basierend auf einer ID mit fehlenden Werten und String

mydf<- structure(list(IDs = c(11L, 16L, 19L, 21L, 22L, 24L, 42L, 43L, 
51L), string1 = structure(c(1L, 8L, 7L, 2L, 4L, 9L, 6L, 3L, 5L 
), .Label = c("b", "g", "hue", "hyu", "if", "jud", "ufhy", "uhgf;ffugf", 
"uhgs"), class = "factor"), IDs.1 = c(4L, 11L, 16L, 19L, 20L, 
22L, 29L, NA, NA), string2 = structure(c(2L, 3L, 8L, 7L, 4L, 
5L, 6L, 1L, 1L), .Label = c("", "a", "b", "higf;hdugd", "hyu", 
"inja", "ufhy", "uhgf;ffugf"), class = "factor")), .Names = c("IDs", 
"string1", "IDs.1", "string2"), class = "data.frame", row.names = c(NA, 
-9L)) 

gezeigt Ich möchte, dass sie wie zusammen bekommen unter

myout<- structure(list(Ids = c(4L, 11L, 16L, 19L, 20L, 21L, 22L, 24L, 
29L, 42L, 43L, 51L), string = structure(c(1L, 2L, 11L, 10L, 4L, 
3L, 6L, 12L, 8L, 9L, 5L, 7L), .Label = c("a", "b", "g", "higf;hdugd", 
"hue", "hyu", "if", "inja", "jud", "ufhy", "uhgf;ffugf", "uhgs" 
), class = "factor")), .Names = c("Ids", "string"), class = "data.frame", row.names = c(NA, 
-12L)) 

Ich habe versucht, es zu tun mit merge

df1 <- mydf[,1:2] 
df2 <- mydf[,3:4] 
df3 = merge(df1, df2, by.x=c("IDs", "string")) 

was mir einen Fehler gibt, weil sie ungleich

sind

ich auch versucht, den Ansatz hier How to join (merge) data frames (inner, outer, left, right)? gegeben zu verwenden, das nicht mein Problem lösen

meine Eingabe ist wie dies

IDs string1  IDs string2 
11 b    4 a 
16 uhgf;ffugf  11 b 
19 ufhy   16 uhgf;ffugf 
21 g    19 ufhy 
22 hyu   20 higf;hdugd 
24 uhgs   22 hyu 
42 jud   29 inja 
43 hue  
51 if 

und die Ausgabe wie folgt aussieht

Ids string 
4 a 
11 b 
16 uhgf;ffugf 
19 ufhy 
20 higf;hdugd 
21 g 
22 hyu 
24 uhgs 
29 inja 
42 jud 
43 hue 
51 if 

z.B. 11, 16 usw. werden zweimal wiederholt, so dass wir wollen, dass sie nur einmal

+0

In Ihrem 'mydf', haben die 11 eine passende String sowohl 'a' und 'b', also warum ist '11‘ nach links aus der myout – akrun

+0

@akrun sollte nur einer von ihnen sein, weil Sie sind sich ähnlich. sie sollten nur einmal und nicht zweimal wiederholen, ich machte eine Visualisierung über – nik

Antwort

2

Wir können eine rbind tun und entfernen Sie die duplicated Elemente

library(data.table) 
setnames(rbindlist(list(mydf[3:4], mydf[1:2]))[!is.na(IDs.1)&!duplicated(IDs.1)], 
      c("Ids", "string"))[order(Ids)] 
# Ids  string 
# 1: 4   a 
# 2: 11   b 
# 3: 16 uhgf;ffugf 
# 4: 19  ufhy 
# 5: 20 higf;hdugd 
# 6: 21   g 
# 7: 22  hyu 
# 8: 24  uhgs 
# 9: 29  inja 
#10: 42  jud 
#11: 43  hue 
#12: 51   if 

Oder eine andere Option ist melt von data.table (konvertieren zu " langes "Format", das mehrere measure Muster annehmen kann, dann entfernen Sie die duplicated 'Ids' und order mit 'Ids'.

melt(setDT(mydf), measure = patterns("ID", "string"), na.rm=TRUE, 
    value.name = c("Ids", "string"))[!duplicated(Ids, fromLast=TRUE) 
     ][, variable := NULL][order(Ids)] 
+0

ein Problem ist, sie sind nicht sortieren, schauen Sie zum Beispiel 20, 22, 29, 21 usw. – nik

+0

Ich mochte und akzeptierte es. ist es möglich, mir auch eine Idee zu geben, wie man findet, wie viele in beiden IDs ähnlich sind und wie viele und welche ungleich sind? – nik

+0

@nik Vielleicht 'Länge (Reduzieren (Schnittpunkt, mydf [grep (" ID ", Namen (meindf))])) # [1] 4; nrow (mydf) -length (Reduce (überschneiden, mydf [grep ("ID", Namen (meindf))])) # [1] 5' – akrun

Verwandte Themen