2013-07-03 18 views
6

この問題でレンガの壁に当たっています。R重複する行ではなく、文字ベクタ内の重複する要素を削除します。

私は文字ベクトルに保存されているいくつかの文書IDと日付を持つデータフレーム(日付)を持っている:

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

私はこの結果を得るために日付で重複要素を削除しようとしています:

R>unique(dates$dates) 

をそれが日付で重複行を削除します:

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

私が試してみました

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

日付の重複要素のみを削除し、重複行を日付で削除しない方法についてのヘルプはありますか?データ

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

で更新

* *だから私の問題は、行873内の重複する日付を取り除くためにどのようにでしょうか?私は日付でc()gsubなり、その後、行ごとに、私は,

テストされていないが、おそらく何かなどを使用してのstrsplituniqueを呼ぶだろう

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

'dput(dates)'の出力を提供してください。データを再作成するのではなく、コピー/ペーストするだけです。 – Arun

答えて

1

はこれを試してみてください。 sapply(dates$dates, function(x){ new.x=gsub("c(|)","",x) new.x=strsplit(new.x, ",") unique(new.x) })

+0

Arun - 私が使用しているシステムからコピー/ペーストできません(尋ねるのは非常に困難です)。私はその中で試してみると、成功すればシステムの外で再利用できるデータセットが作成されます。ありがとう。 – user2547308

+0

FYI - 問題を解決しました: – user2547308

+0

FYI - 私は問題を解決しました:問題の解決策:ラップ(strapply()、ユニーク) (\ | d {1,2}(\ | - )\\ d {1,2}(/ | - )\\ d {2,4})|([^ /] \\ {1,2}(d | 1,2)(/ | - )\\ d {2,4})| (1月| 2月| 6月| 4月| 6月| 7月| 9月| 10月| \\ d {2,4}){0、})){\\ s | - ] {0,2} \\ d {1,4} ))))、ユニーク)) – user2547308

0

+0

私は 'Dates'列は実際には' list'だと思います。文字列ではありません。 –

1

私は重複を削除していた問題を解決しました文字ベクトルの値 - (strapply()、ユニーク)lapplyをラップ:すべてのあなたの助けを

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

感謝。

0

あなたはこのようなものを探しているかもしれません。

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 
関連する問題