2016-08-12 2 views
4

Ich versuche Set-Operationen (intersect, union, setdiff, setequal) auf Listen-Variablen auszuführen, die Zeichenvektoren als Listenelemente haben. Zum BeispielSetze Operationen mit dplyr :: rowwise

library(dplyr) 
list1 = list(c('a', 'b'), c('x', 'y', 'z')) 
list2 = list(c('b'), c('x', 'z')) 
df = data_frame(x = list1, y = list2) 

So etwas wie

df %>% rowwise() %>% mutate(z = setdiff(x, y)) 

scheint zu funktionieren. Aber nicht

df %>% rowwise() %>% mutate(z = intersect(x, y)) 

mit intersect() gibt die Fehlermeldung:

Error: incompatible size (2), expecting 1 (the group size) or 1

Antwort

4

intersect() kehrt mehr als ein Element für die zweite Reihe, müssen Sie es als eine Liste wickeln, eine Zelle zu passen:

df %>% rowwise() %>% mutate(z = list(intersect(x, y))) 

# Source: local data frame [2 x 3] 
# Groups: <by row> 

#   x   y   z 
#  <list> <list> <list> 
# 1 <chr [2]> <chr [1]> <chr [1]> 
# 2 <chr [3]> <chr [2]> <chr [2]> 
+1

Nebenbei gilt das Gleiche für setdiff, nur nicht in diesem speziellen Fall, wo beide Zeilen ein 1-Element diff haben. – AlexR