このようなデータフレームがある場合:
x y
13 a
14 b
15 c
15 c
14 b
そして、同じ行の各グループに、次のような一意のIDを持たせたいと思いました。
x y id
13 a 1
14 b 2
15 c 3
15 c 3
14 b 2
これを行う簡単な方法はありますか?
ありがとう
このようなデータフレームがある場合:
x y
13 a
14 b
15 c
15 c
14 b
そして、同じ行の各グループに、次のような一意のIDを持たせたいと思いました。
x y id
13 a 1
14 b 2
15 c 3
15 c 3
14 b 2
これを行う簡単な方法はありますか?
ありがとう
このアプローチには少し懸念がありpaste0ます。列にさらに複雑なデータが含まれている場合、次のような驚くべき結果が得られる可能性があります。
x y
ab c
a bc
1つの解決策は、に置き換えることpaste0(...)ですpaste(..., sep = "@")。それでも、ある種のデータに含まれるsep確率は常にゼロ以外であるため、どのタイプのデータでも機能するような一般的なものを思い付くことができません。sep
より堅牢なアプローチは、分割/変換/結合アプローチを使用することです。あなたは確かにbaseパッケージでそれを行うことができますがplyr、それを少し簡単にします:
library(plyr)
.idx <- 0L
ddply(df, colnames(df), transform, id = (.idx <<- .idx + 1L))
これが遅すぎる場合は、data.tableここで提案されているアプローチをお勧めします:data.table「キーインデックス」または「グループカウンター」
これは私が最初に考えたものです:
値を文字列に貼り付けて、2つの列を組み合わせるだけの新しい変数を作成します。
a<-paste0(z$x,z$y) #z is your data.frame
これを要因として作成し、データフレームに結合します。
cbind(z,id=factor(a,labels=1:length(unique(a))))
編集:@flodelは使用について懸念してpaste0いました、通常のpaste、または相互作用を使用する方が良いです:
a<-interaction(z,drop=TRUE)
cbind(z,id=factor(a,labels=1:length(unique(a))))
x=abこれは、、、、、を分離することを前提y=cとx=aしていますy=bc。そうでない場合は、を使用しますpaste0。