2016-12-11 3 views
3

Meine Daten unter denen ich mag es teilen, basierend auf IDs in mehrere TeileSplitting ein Datum in mehrere Teile

df1<- structure(list(Ids1 = 1:7, string1 = structure(c(3L, 2L, 4L, 
1L, 1L, 1L, 1L), .Label = c("gdyijq,udyhfs,gqdtr", "hdydg", "hishsgd,gugddf", 
"ydis"), class = "factor"), Ids2 = c(1L, 3L, 4L, 9L, 10L, NA, 
NA), string2 = structure(c(4L, 6L, 2L, 3L, 5L, 1L, 1L), .Label = c("", 
"gdyijq,udyhfs", "gqdtr", "hishsgd,gugddf", "nlrshf", "ydis"), class = "factor")), .Names = c("Ids1", 
"string1", "Ids2", "string2"), class = "data.frame", row.names = c(NA, 
-7L)) 

Die erste mag ich df.1 machen, wenn ich nur diejenigen halten, die ähnliche Ids haben und zähle, wie viele von string1 String2 ähneln (sie sind durch ein Komma getrennt).

Ids1 string1   ids2 string2   Similar 
1 hishsgd,gugddf  1  hishsgd,gugddf  2 
3 ydis     3  ydis    1 
4 gdyijq,udyhfs,gqdtr 4  gdyijq,udyhfs  2 

Ich mache das

df.1 <- df1[which(df1$Ids1 == df1$Ids2), ] 

das gibt mir nur die erste Zeile und nichts anderes

Dann habe ich diejenigen haben wollen, dass es nur IDs 1, die in Ids2

nicht existieren
Ids1 string1 
2  hdydg 
5  gdyijq,udyhfs,gqdtr 
6  gdyijq,udyhfs,gqdtr 
7  gdyijq,udyhfs,gqdtr 

ich tue dies aber auch nicht

funktioniert
df.2<- df1[which(df1$Ids1 != df1$Ids2), ] 

und das letzte, was ich möchte diejenigen halten, die nur in Ids2 sind und IDS1 nicht

Ids1 string1 
9  gqdtr 
10  nlrshf 

die ich tun dies aber auch nicht

df.3<- df1[which(df1$Ids2 != df1$Ids1), ] 

Antwort

1

Hier funktioniert ist eine Lösung, die ich könnte basierend auf Verbindungen mit dplyr Paket:

library(dplyr) 

df.1 <- inner_join(select(df1, Ids1, string1), select(df1, Ids2, string2), by = c('Ids1' = 'Ids2')) 
df.1$Similar <- apply(df.1[, -1], 1, function(x) sum(unlist(strsplit(x[1], ',')) %in% unlist(strsplit(x[2], ',')))) 

df.2 <- anti_join(select(df1, Ids1, string1), select(df1, Ids2, string2), by = c('Ids1' = 'Ids2')) 
df.3 <- anti_join(select(df1, Ids2, string2), select(df1, Ids1, string1), by = c('Ids2' = 'Ids1')) 
df.3 <- df.3[complete.cases(df.3), ] 

Sie kann auch etwas anderes für df.2 und df.3 wie folgt tun:

df.2 <- df1[!df1$Ids1 %in% df1$Ids2, c('Ids1', 'string1')] 
df.3 <- df1[!df1$Ids2 %in% df1$Ids1, c('Ids2', 'string2')] 
df.3 <- df.3[complete.cases(df.3), ] 
+0

danke ich akzeptierte und mochte deine Antwort – nik