2014-04-07 72 views
1

這是一個奇怪的問題。我試圖用矢量化代碼而不是循環做更多的事情。我知道我可以用循環做到這一點,我正在尋找的是R中速度向量化的方式。我有一個表創造性地命名tbl看起來像這樣:R基於行元素的計算重複行

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

我想重複C和d的值,A和B之間的值的數量在這種情況下,將是第一個實例行,第二行的一個實例和第三行的三個重複。我們的目標是:

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")])是絆倒的部分,因爲它不知道它正在處理哪一行。任何幫助或指導表示讚賞。如果我要掉下錯誤的兔子洞,請隨時告訴我。謝謝!

回答

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 
+0

任何機會,這可以用來返回一個列表,而不是一個data.frame的? –

+0

@MatthewCrews,那會是什麼樣子? ('data.frame's的'list')?在完成之後,也許看看使用'split'吧? – A5C1D2H2I1M1N2O1R2T1

+0

這將是一個列表清單。這個特定的用例需要列表的列表。分裂工作! –

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