4

このようなデータフレームがある場合:

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

これを行う簡単な方法はありますか?

ありがとう

4

2 に答える 2

4

このアプローチには少し懸念があり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「キーインデックス」または「グループカウンター」

于 2013-03-08T21:27:34.963 に答える
3

これは私が最初に考えたものです:

値を文字列に貼り付けて、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=cx=aしていますy=bc。そうでない場合は、を使用しますpaste0

于 2013-03-08T20:53:26.693 に答える