2013-07-03 27 views
6

Sto colpendo un muro di mattoni con questo problema.R rimuovere gli elementi duplicati nel vettore di caratteri, non le righe duplicate

Ho un frame di dati (le date) con alcune ID dei documenti e le date memorizzate in un vettore di carattere:

Doc  Dates 
1 12345 c("06/01/2000","08/09/2002") 
2 23456 c("07/01/2000", 09/08/2003", "07/01/2000") 
3 34567 c("09/06/2004", "09/06/2004", "12/30/2006") 
4 45678 c("06/01/2000","08/09/2002") 

Sto cercando di rimuovere gli elementi duplicati nelle date per ottenere questo risultato:

Doc  Dates 
1 12345 c("06/01/2000","08/09/2002") 
2 23456 c("07/01/2000", 09/08/2003") 
3 34567 c("09/06/2004", "12/30/2006") 
4 45678 c("06/01/2000","08/09/2002") 

ho provato:

R>unique(dates$dates) 

ma rimuove le righe duplicate da Date:

Doc  Dates 
1 12345 c("06/01/2000","08/09/2002") 
2 23456 c("07/01/2000", 09/08/2003") 
3 34567 c("09/06/2004", "12/30/2006") 

Qualsiasi aiuto su come rimuovere solo gli elementi duplicati in Date e non rimuovere le righe duplicate in base alle date?

* * aggiornato con i dati

# Match some text string (dates) from some text: 

df1$dates <- as.character(strapply(df1[[2]], "((\\D\\d{1,2}(/|-)\\d{1,2}(/|-)\\d{2,4})| ([^/]\\d{1,2}(/|-)\\d{2,4})|((JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV){1}[\\s|-]{0,2}\\d{1,4}(\\D[\\s|-]{0,}\\d{2,4}){0,}))")) 

# Drop first 2 columns from dataframe 
df2<-df1[ -c(1,2)] 

# List data 
>df2 
872      7/23/2007 
873 c(" 11/4/2007", " 11/4/2007") 
874 c(" 4/2/2008", " 8/2/2007") 
880     11/14/2006 

> class(df2) 
[1] "data.frame" 

> class(df2$dates) 
[1] "character" 

> dput(df2) 
structure(list(dates = c("NULL", "NULL", " 7/23/2007", "c(\" 11/4/2007\", \" 11/4/2007\")", 
"c(\" 4/2/2008\", \" 8/2/2007\")", "NULL", "NULL", "NULL", "NULL", 
"NULL", " 11/14/2006")), .Names = "dates", class = "data.frame", row.names = 870:880) 

Quindi il mio problema è come sbarazzarsi delle date duplicate in Row 873?

+1

fornire l'output da 'dput (date)'. Sarebbe utile copiare/incollare invece di ricreare i tuoi dati. – Arun

risposta

1

Prova questo:

within(dates, Dates <- lapply(Dates, unique)) 
+0

Arun - impossibile copiare/incollare dal sistema che sto usando (rende molto difficile la richiesta). Proverò l'interno e, salvo il successo, creerò un set di dati che posso usare al di fuori del sistema e ripubblicare. Grazie. – user2547308

+0

FYI - Ho risolto il problema: – user2547308

+0

FYI - Ho risolto il problema: racchiudere un lapply (strapply(), univoco) attorno alla stringa: df1 $ date <- as.character (lapply ((strapply (df1 [[2]] , "((\\ D \\ d {1,2} (/ | -) \\ d {1,2} (/ | -) \\ d {2,4}) | ([^ /] \\ d {1,2} (/ | -) \\ d {2,4}) | ((JAN | FEB | MAR | APR | MAY | JUN | JUL | AUG | SEP | OCT | NOV) {1} [ \\ s | -] {0,2} \\ d {1,4} (\\ d [\\ s | -] {0,} \\ d {2,4}) {0,}))")), unico)) – user2547308

0

avrei gsub fuori c( e ) in date e poi per ogni riga che chiamerei unique su un strsplit di esso utilizzando il ,

il fitness, ma forse qualcosa di simile: sapply(dates$dates, function(x){ new.x=gsub("c(|)","",x) new.x=strsplit(new.x, ",") unique(new.x) })

+0

Penso che la colonna 'Date 'sia effettivamente una' lista', non una stringa. –

1

Ho risolto il problema relativo alla rimozione di duplicati valori da un vettore di carattere - avvolgere un lapply (strapply(), unico):

df1$date <- as.character(lapply((strapply(df1[[2]], "((\\D\\d{1,2}(/|-)\\d{1,2}(/|- )\\d{2,4})|(\\s\\d{1,2}(/|-)\\d{2,4})|((JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV){1}[\\s|-]{0,2}\\d{1,4}(\\D[\\s|-]{0,}\\d{2,4}){0,}))")),unique)) 

Grazie per tutto il vostro aiuto.

0

Forse stai cercando qualcosa di simile.

df 

    Doc          Dates 
1 12345    c("06/01/2000","08/09/2002") 
2 23456 c("07/01/2000", "09/08/2003", "07/01/2000") 
3 34567 c("09/06/2004", "09/06/2004", "12/30/2006") 
4 45678    c("06/01/2000","08/09/2002") 

Eval and Parse 
x <- t(sapply(df[,"Dates"],function(x){unique(eval(parse(text = x)))})) 
df$Dates <- paste(x[,1],x[,2],sep=",") 

df 
     Doc     Dates 
    1 12345 06/01/2000,08/09/2002 
    2 23456 07/01/2000,09/08/2003 
    3 34567 09/06/2004,12/30/2006 
    4 45678 06/01/2000,08/09/2002 


Same can be achieved using Regex: 

paste(unique(unlist(strsplit(gsub("c\\(|\\)","",'c("24/07/2012","22/01/2012","24/07/2012")'),","))),sep = "") 

[1] "\"24/07/2012\"" "\"22/01/2012\"" 

Haven't tried on data but works 
Problemi correlati