R:在组内重复一系列数字,这些数字在组之间不同

时间:2013-08-23 02:24:04

标签: r

我有一个类似于下面的数据框,我将其称为数据框1.对于与“tank”列(或其他列)中的每个数字相关联的行数,没有常规模式就此而言)。

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

我需要重复每个罐中“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))

对不起,这太长了,但我很难解释我需要做什么而不提供示例。提前感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分: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相关联的插图,以全面了解正在发生的事情。

我们正在做的事情是在小插曲中逐个召唤。