5

これは些細なことだと思いますが、その方法がわかりません。

私は個人が存在するデータフレームを持っており、それぞれが複数のプロパティを持つことができ、各プロパティはいくつかの方法で分類されます。現在、それは長い形であり、レコードは次のように見えます(概略形式では、実際にはもう少し複雑です):

IndividualID Property PropClass 
1            X         A 
1            Y         B 
2            X         A 
3            Y         B
3            W         C
3            Z         A

私が欲しいのは、個々のIDごとに1つの行で、個々のIDと、その個人が元のファイルに持っている各プロパティとPropClassの列のペアです。この場合は次のようになります。

 IndividualID  Prop1   PropClass1 Prop2  PropClass2  Prop3  PropClass3
 1             X       A          Y      B           NA     NA
 2             X       A          NA     NA          NA     NA
 3             Y       B          W      C           Z      A

したがって、元のデータセット内のindividualIDの最大行数(大きくない約5)と同じ数のProp変数とPropClass変数が必要であり、元のデータセットの行数はその最大数よりも少なくなります。 、その個人にとって何の意味もない余分な列には、NAが含まれています。個人のProp変数とPropClass変数の順序は重要ではありません(ただし、長い形式のファイルの元の順序である場合もあります)。

明らかに、Propのすべての可能な値に対して1組のProp列とpropClass列がある場合、これを行うのは簡単です(たとえば、reshapeを使用)が、Propの可能な値は数百あるため、ファイルは巨大で役に立たなくなります。自分のやりたいことを簡単にやる方法がないなんて信じられませんが、一生懸命探しているように見えますが、見つけられませんでした。私はバカだと言ってください。もしそうなら、どうやってバカを治すことができるのでしょうか。

4

2 に答える 2

2

これを行うにはおそらくもっと効率的な方法がありますが、今は考えられません。ワイドフォーマットに変換する必要がある2つの変数があるので、それらを別々にキャストしてから、2つをマージする必要があると思います。しかし、私は間違っていると証明されたいです。これを行うために、新しいIDごとに列シーケンスを生成する2つの新しい変数を作成します。これにより、NAを簡単に埋めることができます。新しい列を使用すると、それらを適切な形式にキャストしてマージするのは非常に簡単です。

library(plyr)
library(reshape2)

#Assumes your data is read into a variable named x
x <- ddply(x, "IndividualID", transform, 
      castPropClass = paste0("PropClass", seq(length(PropClass))),
      castProp = paste0("Prop", seq(length(Property))))

#Use these two new variables to cast into wide format. Wrap in merge to join together:
merge(dcast(IndividualID ~ castPropClass, value.var = "PropClass", data = x),
      dcast(IndividualID ~ castProp,      value.var = "Property",  data = x))
#Gives you this:
  IndividualID PropClass1 PropClass2 PropClass3 Prop1 Prop2 Prop3
1            1          A          B       <NA>     X     Y  <NA>
2            2          A       <NA>       <NA>     X  <NA>  <NA>
3            3          B          C          A     Y     W     Z

これは明らかに列の正しい「順序」を持っていませんが、データ自体は正しいです。

于 2012-07-02T22:18:45.617 に答える
1

このようなものは受け入れられますか?

test.dt<-data.frame(id=(c(1,1,2,3,3,3)), property=(c("X","Y","X","Y","W","Z")), property.clss=(c("A","B","A","B","C","A")))
library(reshape)
m<-melt(data=test.dt, id.vars="id", measure.vars=c("property.clss"))
m
n<-melt(data=test.dt, id.vars="id", measure.vars=c("property"))
n
c1<-data.frame(cast(m, id~value))
colnames(c1)<-c("id", paste("property",colnames(c1)[colnames(c1)!="id"],sep=""))
c1
c2<-data.frame(cast(n,id~value))
colnames(c2)<-c("id", paste("property.clss",(colnames(c2)[colnames(c2)!="id"]),sep=""))
c2
merge(c1,c2,by="id")
于 2012-07-02T22:41:52.817 に答える