このようなデータフレームがある場合:
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
。