2013-08-23 21 views
1

我有一個數據框,看起來像下面的數據框,我將其稱爲數據框1.沒有固定模式的數量與「tank」列中的每個數字關聯的行(或關於該事件的其他列)。R:在組內重複一系列數字每組之間的次數

#code for making data frame 1 
tank<-c(1,1,2,3,3,3,4,4) 
size<-c(2.1,3.5,2.3,4.0,3.3,2.2,1.9,3.0) 
mass<-c(6.5,5.5,5.9,7.2,4.9,8.0,9.1,6.3) 
df1<-data.frame(cbind(tank,size,mass)) 

我需要重複的值在每個水箱內的「大小」和「質量」欄目中發現的序列。然而,每個坦克序列的重複次數會有所不同(再次沒有特定的模式)。我有一個包含重複每個罐的序列號的另一個數據幀(數據幀2),它看起來是這樣的:

#code for making data frame 2 
tank<-c(1,2,3,4) 
rpeat<-c(3,1,2,2) 
df2<-data.frame(cbind(tank,rpeat)) 

最終,我的目標是有一個這樣的數據幀(見下文)。一個罐中的每一個系列的值被重複等於在數據幀2.

#code for making data frame 3 
tank<-c(1,1,1,1,1,1,2,3,3,3,3,3,3,4,4,4,4) 
size<-c(2.1,3.5,2.1,3.5,2.1,3.5,2.3,4.0,3.3,2.2,4.0,3.3,2.2,1.9,3.0,1.9,3.0) 
mass<-c(6.5,5.5,6.5,5.5,6.5,5.5,5.9,7.2,4.9,8.0,7.2,4.9,8.0,9.1,6.3,9.1,6.3) 
df3<-data.frame(cbind(tank,size,mass)) 

我已想出稍微粗的方式來做到這一點,當在尺寸和質量列每個數字是指定的次數只是重複指定的次數(見下文),而不是如何創建我需要的重複序列。

#code to make data frame 4 
tank<-c(1,1,1,1,1,1,2,3,3,3,3,3,3,4,4,4,4) 
size2<-c(2.1,2.1,2.1,3.5,3.5,3.5,2.3,4.0,4.0,3.3,3.3,2.2,2.2,1.9,1.9,3.0,3.0) 
mass2<-c(6.5,6.5,6.5,5.5,5.5,5.5,5.9,7.2,7.2,4.9,4.9,8.0,8.0,9.1,9.1,6.3,6.3) 
df4<-data.frame(cbind(tank,size,mass)) 

爲了製作上面的數據幀,我把下面的數據框,它結合了數據幀1和2,並應用下面的代碼。

#code to produce data frame 5 
tank<-c(1,1,2,3,3,3,4,4) 
size<-c(2.1,3.5,2.3,4.0,3.3,2.2,1.9,3.0) 
mass<-c(6.5,5.5,5.9,7.2,4.9,8.0,9.1,6.3) 
rpeat<-c(3,3,1,2,2,2,2,2) 
df5<-data.frame(cbind(tank,size,mass,rpeat)) 

#code to produce data frame 4 from data frame 5 
tank_col <- rep(df5$tank, times = df5$rpeat) 
size_col <- rep(df5$size, times = df5$rpeat) 
mass_col <- rep(df5$mass, times = df5$rpeat) 
goal <-data.frame(cbind(tank_col,size_col,mass_col)) 

對不起,這是很長的,但我很難解釋我需要做什麼,沒有提供的例子。預先感謝您提供的任何幫助。

回答

2

您可以使用data.table

library(data.table) 
# create df1 and df2 as data.tables keyed by tank 
DT1 <- data.table(df1, key = 'tank') 
DT2 <- data.table(df2, key = 'tank') 

# you can now join on tank, and repeat all columns in 
# .SD (the subset of the data.table) 
DT1[DT2, lapply(.SD, rep, times = rpeat)] 


# 1: 1 2.1 6.5 
# 2: 1 3.5 5.5 
# 3: 1 2.1 6.5 
# 4: 1 3.5 5.5 
# 5: 1 2.1 6.5 
# 6: 1 3.5 5.5 
# 7: 2 2.3 5.9 
# 8: 3 4.0 7.2 
# 9: 3 3.3 4.9 
# 10: 3 2.2 8.0 
# 11: 3 4.0 7.2 
# 12: 3 3.3 4.9 
# 13: 3 2.2 8.0 
# 14: 4 1.9 9.1 
# 15: 4 3.0 6.3 
# 16: 4 1.9 9.1 
# 17: 4 3.0 6.3 

閱讀與data.table有關的小插曲讓正在發生的事情有充分的瞭解。

我們正在做的事情在旁邊的小插曲裏被稱爲by-without-by。

+0

謝謝mnel。這照顧了我的問題。我沒有意識到data.table包。我一定會閱讀更多關於使用它。 – user2709041

相關問題