R:快速乘以data.frame(或其他数据结构)中的选定行

pms*_*pms 4 r dataframe

我有一个像data.frame这样的类型的对象,但更大:

> head(mydf)  
   id1     id2   n  
1    0 1032142   3  
2    0 1072163   1  
3    0  119323   2  
Run Code Online (Sandbox Code Playgroud)

我需要打印到文件列a1a1,他们每个人的n时间.这样我就可以获得这样的文件:

0 1032142  
0 1032142  
0 1032142  
0 1072163  
0  119323  
0  119323  
Run Code Online (Sandbox Code Playgroud)

我尝试了以下解决方案,但他们使用显式for循环并且速度非常慢(用我的数据完成它们需要几天时间):

for (j in 1:(nrow(mydf))) for (i in 1:(mydf[j,"n"])) write.table( mydf[j,c("id1","id2")], file="trials", append=T, row.names= F, col.names=F )
Run Code Online (Sandbox Code Playgroud)

另一个尝试使用乘法行构建一个新的data.frame,但运行速度更慢.

towrite=data.frame(); for (j in 1:(nrow(mydf))) for (i in 1:(mydf[j,"n"])) towrite=rbind(towrite,mydf[j,c("id1","id2")])
Run Code Online (Sandbox Code Playgroud)

在R下解决这个问题的最简单,最快捷的方法是什么?

Vit*_*hKa 6

尝试对数据进行子集化并一次保存:

mydf[rep(1:nrow(mydf), mydf$n), ]
Run Code Online (Sandbox Code Playgroud)

如果您的数据是数字,那么操作矩阵要快得多:

mymat <- as.matrix(mydf)
reps <- as.integer(mydf$n)
mymat[rep(1:nrow(mymat), reps), ]

  id1     id2 n
1   0 1032142 3
1   0 1032142 3
1   0 1032142 3
2   0 1072163 1
3   0  119323 2
3   0  119323 2
Run Code Online (Sandbox Code Playgroud)

如果您设法操纵原始data.frame,那么您可能能够处理上述矩阵.