2013-07-03 9 views
6

Uderzam w mur z tym problemem.R usuwaj zduplikowane elementy w wektorze znakowym, nie duplikuj wierszy

Mam ramki danych (daty) z niektórych identyfikatorów dokumentów i terminów zapisanych w postaci wektorowej:

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") 

Próbuję usunąć zduplikowane elementy w daty, aby uzyskać ten wynik:

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") 

próbowałem:

R>unique(dates$dates) 

ale usuwa zduplikowane wiersze o terminach:

Dowolna pomoc dotycząca usuwania tylko duplikatów elementów z dat, a nie usuwania zduplikowanych wierszy według dat?

* * aktualizowane danymi

# 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) 

Więc moim problemem jest to, w jaki sposób pozbyć się duplikatów terminów w wierszu 873?

+1

proszę podać wynik z 'dput (daty)'. Pomoże to po prostu skopiować/wkleić zamiast odtworzyć swoje dane. – Arun

Odpowiedz

1

Spróbuj tego:

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

Arun - nie można skopiować/przeszłość z systemu, którego używam (pyta? Bardzo trudne). Wypróbuję wnętrze i, z wyjątkiem wszelkich sukcesów, stworzę zestaw danych, który będę mógł wykorzystać poza systemem i odświeżyć. Dzięki. – user2547308

+0

FYI - Rozwiązałem problem: – user2547308

+0

FYI - Rozwiązałem problem: zawijam lapply (strapply(), unique) wokół strapply: 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 | MAJ | JUN | JUL | AUG | SEP | OCT | NOV) {1} [ \\ s | -] {0,2} \\ d {1,4} (\\ D [\\ s | -] {0,} \\ d {2,4}) {0,})) ")), unikalny)) – user2547308

0

bym gsub się c( i ) w terminach, a następnie dla każdego wiersza nazwałbym unique na strsplit nim używając ,

NIETESTOWANY ale może coś takiego: sapply(dates$dates, function(x){ new.x=gsub("c(|)","",x) new.x=strsplit(new.x, ",") unique(new.x) })

+0

Myślę, że kolumna 'Daty' jest w rzeczywistości' listą', a nie łańcuchem. –

1

Rozwiązałem problem z usuwaniem duplikatu wartości z wektora znaków - owinąć lapply (strapply(), unikatowy):

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)) 

Dzięki za pomoc.

0

Być może szukasz czegoś takiego.

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 
Powiązane problemy