R基于行元素的计算重复行

时间:2014-04-07 18:59:04

标签: r vectorization rep

这是一个奇怪的。我试图用矢量化代码而不是循环来做更多事情。我知道我可以用循环做到这一点,我正在寻找的是R中用于速度的矢量化方式。我有一个创造性地命名为tbl的表格,如下所示:

A ,B ,C  ,D
1 ,1 ,10 ,22
2 ,2 ,12 ,32
3 ,5 ,44 ,37

我想重复C和D的值作为A和B之间的值的数量。在这种情况下,将存在第一行的一个实例,第二行的一个实例和第三行的3个重复。目标是:

C  ,D
10 ,22
12 ,32
44 ,37
44 ,37
44 ,37

到目前为止我所拥有的是它,但它不起作用:

rep(list(tbl[,c("C","D")]), (tbl["B"] - tbl["A"] + 1) )

如果我迭代行,它可以工作,但我宁愿在一次传递中作为矢量化函数。我有一种感觉list(tbl[,c("C","D")])是绊倒的部分,因为它不知道它正在处理哪一行。任何帮助或指导表示赞赏。如果我走错了兔子洞,请随时告诉我。谢谢!

2 个答案:

答案 0 :(得分:1)

你实际上非常接近。

请改为尝试:

tbl[rep(rownames(tbl), tbl[, "B"] - tbl[, "A"] + 1), c("C", "D")]
#      C  D
# 1   10 22
# 2   12 32
# 3   44 37
# 3.1 44 37
# 3.2 44 37

答案 1 :(得分:1)

DF <- read.table(text="A ,B ,C  ,D
1 ,1 ,10 ,22
2 ,2 ,12 ,32
3 ,5 ,44 ,37", sep=",", header=TRUE)

DF[rep(seq_len(nrow(DF)), DF$B-DF$A+1), c("C", "D")]

#     C  D
#1   10 22
#2   12 32
#3   44 37
#3.1 44 37
#3.2 44 37