簡體   English   中英

r使用未知列數重新整形數據

[英]r reshape data long to wide with unknown number of columns

我確信這是微不足道的,但我找不到怎么做。

我有一個數據框,其中有個人,每個人可以有幾個屬性,每個屬性都以多種方式分類。 Currenly它的形狀很長,看起來很像(在原理圖中,實際上它有點復雜):

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

我想要的是每個單獨ID的一行,具有單個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

因此,必須有與原始數據集中任何個別ID的最大行數(不大,約為5)一樣多的Prop和PropClass變量,並且個人在原始數據集中的行數少於該最大數量,對於那個人來說沒有任何意義的額外列在其中有NA。 個人的Prop和PropClass變量的順序無關緊要(盡管它也可能是長格式文件的原始順序)。

顯然,如果你為Prop的每個可能值都有一對Prop和propClass列,那么很容易做到這一點(例如使用reshape),但是Prop有幾百個可能的值,所以文件變得龐大而且無益。 我無法相信沒有一種簡單的方法可以做我想要的事情,但我還是沒有找到它,盡管在我看來,這是一種刻薄的搜索。 請告訴我,我是個白痴,如果是的話,我怎么能治好我的愚蠢。

可能有一種更有效的方法,但我現在想不到它。 由於需要將兩個變量轉換為寬格式,我認為您可能需要單獨轉換它們然后將兩者合並在一起。 我很想被證明是錯的。 為此,我創建了兩個新變量,為每個新ID生成一個列序列。 這將使他們能夠輕松填充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

這顯然沒有列的正確“順序”,但數據本身是正確的。

這樣的事情會被接受嗎?

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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM