2011-10-13 6 views
8

私は分類情報を持つ大きなデータフレームを持っています。次に例を示します。data.frameの特定の列にstrsplitを適用します。

> d <- data.frame(x = c(1,2,3,4), classification = c("cl1.scl1", "cl2", "cl3-bla", "cl4.subclass2")) 
> d 
    x classification 
1 1  cl1.scl1 
2 2   cl2 
3 3  cl3-bla 
4 4 cl4.subclass2 

私は私がで分類文字列を分割する必要があることを意味分類情報を、集計する必要がある任意の更なる処理を行う前に「」最初のトークンを取る。現時点で

> d 
    x classification 
1 1   cl1 
2 2   cl2 
3 3  cl3-bla 
4 4   cl4 

次のように私はこれを計算しています:これは私が必要とする結果である

d$classification = unlist(lapply(d$classification, function (x) strsplit(as.character(x), ".", fixed=TRUE)[[1]][1])) 

これは動作しますが、それはこれを理解するために私にはかなり時間がかかりました。私はおそらく逃したよりエレガントなソリューションがあると仮定します。助言がありますか?ありがとう!

+1

あなたの件名は少し誤解を招きます。これは実際に特定の列に関数を適用することではなく、strsplitから結果を操作する方法です。 –

答えて

3

です。

gsub("(.*)\\.(.*)","\\1",d$classification) 

リテラルピリオドで区切られた2つの参照(括弧内の正規表現の部分)があります。そのパターンに一致するものを最初の参照の内容に置き換えます。

+0

ありがとう、素晴らしいソリューション!私は単純に正規表現をデータフレームに適用できることを知らなかった。 – behas

+1

技術的には、正規表現を文字ベクトルに適用しています( 'd $ classification'はdata.frameではありません)。 –

11

Aやや短いソリューションは、あなたが後方参照で正規表現を使用することができます

sapply(strsplit(as.character(d$class), "\\."), `[`, 1) 
2

「。」の後に続くものは削除してください。

> sub("\\..+$", "", d$class) 
[1] "cl1"  "cl2"  "cl3-bla" "cl4" 

d$classification <- sub("\\..+$", "", d$classification) 
# I've never been very comfortable with partial name matching. 
関連する問題