2016-06-15 150 views
3

df是頻率表,其中a中的值報告的次數與在列x,y,z中記錄的次數相同。我試圖將頻率錶轉換爲原始數據,因此我使用rep()函數。循環r中的rep()函數

如何循環rep()函數爲我提供x,y,z的原始數據,而不必象我在下面那樣多次重複函數?

而且,我可以輸入結果到數據幀,銘記輸出將有不同的列長度:

a <- (1:10) 
x <- (6:15) 
y <- (11:20) 
z <- (16:25) 
df <- data.frame(a,x,y,z) 
df 
rep(df[,1], df[,2]) 
rep(df[,1], df[,3]) 
rep(df[,1], df[,4]) 

回答

3

如果你不想重複for循環,可以隨時嘗試使用apply函數。請注意,由於對象的長度不同,因此無法將其存儲在data.frame中,但可以將其存儲在列表中並以類似於data.frame的方式訪問元素。像這樣的工作:

df2<-sapply(df[,2:4],function(x) rep(df[,1],x)) 

這是什麼sapply功能是說是在df[,2:4]每一列,應用rep(df[,1],x)功能,它在那裏x是你的列(df[,2]df[,3],或df[,4])之一。

下面的代碼只是確保apply函數給出了與原始方式相同的結果。

identical(df2$x,rep(df[,1], df[,2])) 
[1] TRUE 
identical(df2$y,rep(df[,1], df[,3])) 
[1] TRUE 
identical(df2$z,rep(df[,1], df[,4])) 
[1] TRUE 

編輯:

如果你想把它當作一個data.frame對象,你可以這樣做:

res<-as.data.frame(sapply(df2, '[', seq(max(sapply(df2, length))))) 

注意此介紹NA s轉換你的data.frame所以一定要小心!

+0

謝謝@MikeyMike。那就是訣竅。但是,如何將輸出轉換爲我可以使用的數據框,同時將數據保留在各個列中。 – Adedoyin

+0

我試過使用data.frame(矩陣(unlist(df),ncol = 37,by row = T)),它只是給了我一個矩陣,沒有把x,y和z的值放在適當的列下。 – Adedoyin

+0

因爲它們的長度不同,你可以在列中使用NAs嗎? –