2016-08-04 16 views
5

mam następujące wejściaodjąć dwa ciągi od siebie

#mydata 

ID variable1 variable2 
1 a,b,c,d  c,a 
2 g,f,h  h 
3 p,l,m,n,c c,l 

życzę odjąć struny varible2 z variable1 i chciałbym mieć następujący wynik?

#Output 
ID Output 
1 b,d  
2 g,f   
3 p,m,n  

#dput

structure(list(ID = 1:3, variable1 = structure(1:3, .Label = c("a,b,c,d", 
"g,f,h", "p,l,m,n,c"), class = "factor"), variable2 = structure(c(1L, 
3L, 2L), .Label = c("c,a", "c,l", "h"), class = "factor")), .Names = c("ID", 
"variable1", "variable2"), class = "data.frame", row.names = c(NA, 
-3L)) 

Odpowiedz

4

Możemy użyć Map po rozcięciu każda z kolumn przez , uzyskać setdiff, paste nimi razem, ustaw nazwy wyjścia list z 'id' kolumny stack do "data.frame" i set nazwy "ID" i "Dane wyjściowe" dla kolumn.

setNames(stack(setNames(Map(function(x,y) toString(setdiff(x,y)), 
     strsplit(as.character(df1$variable1), ","), 
     strsplit(as.character(df1$variable2), ",")), 
       df1$ID))[2:1], c("ID", "Output")) 
# ID Output 
#1 1 b, d 
#2 2 g, f 
#3 3 p, m, n 

Albo kompaktowym rozwiązaniem byłoby

library(splitstackshape) 
cSplit(df1, 2:3, ",", "long")[, .(Output = toString(setdiff(variable1, variable2))) , ID] 
# ID Output 
#1: 1 b, d 
#2: 2 g, f 
#3: 3 p, m, n 
5

Można spróbować,

Map(setdiff, strsplit(as.character(df$variable1), ',')), strsplit(as.character(df$variable2), ',')) 
+1

@Sotos Tak, to może być, ale myślałem, że chciałbym pokazać oczekiwany wynik – akrun

+0

dobre myślenie. Mam ci znak wyboru :) – Sotos

+1

Dzięki, dodałem kolejną metodę z 'cSplit' – akrun

2

Korzystanie grepl zamiast setdiff

library(stringr) 
a1 <- str_split(d$variable1, ",") 
a2 <- str_split(d$variable2, ",") 
do.call("rbind",Map(function(x,y) paste(x[!grepl(paste(y, collapse="|"), x)], collapse=","), a1, a2)) 
    [,1] 
[1,] "b,d" 
[2,] "g,f" 
[3,] "p,m,n" 
2

Korzystanie Dplyr

mydata %>% 
    rowwise() %>% 
    mutate(output = paste0(setdiff(strsplit(as.character(variable1),split = ",")[[1]], strsplit(as.character(variable2),",")[[1]]),collapse = ",")) 
     %>% select(ID,output) 

wyjściowa:

ID output 
    (int) (chr) 
1  1 b,d 
2  2 g,f 
3  3 p,m,n