1

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

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

我想为 A 和 B 之间的值的数量重复 C 和 D 的值。在这种情况下,将有第一行的一个实例,第二行的一个实例和第三行的 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")])这是绊倒的部分,因为它不知道它正在处理哪一行。任何帮助或指导表示赞赏。如果我走错了兔子洞,请随时告诉我。谢谢!

4

2 回答 2

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
于 2014-04-07T19:06:13.633 回答
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
于 2014-04-07T19:06:14.033 回答