这是一个奇怪的。我试图用矢量化代码而不是循环来做更多事情。我知道我可以用循环做到这一点,我正在寻找的是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")])
是绊倒的部分,因为它不知道它正在处理哪一行。任何帮助或指导表示赞赏。如果我走错了兔子洞,请随时告诉我。谢谢!
答案 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