2017-06-30 45 views
0

我有一個數據幀如下所示:對於/ while循環,直到序列保持

input <- structure(list(rank = c(1L, 2L, 3L, 3L, 4L, 4L, 5L, 5L, 6L, 6L, 
7L, 7L, 8L, 8L, 9L, 10L, 11L, 11L, 11L, 11L, 12L, 12L, 13L, 14L, 
14L, 15L, 16L, 17L, 18L, 19L), sequence = c("HRIGRGGRYGRKGVAI", 
"TQIDELPVDFAAYLGE", "AFSIGLLQRLDFRHNL", "QNDKIAPQDQDSFLDD", "SMHAEMPKSDRERVMN", 
"AQSVIFANTRRKVDWI", "PGRVSDVIKRGALRTE", "AEVISRIGEFLSNSSK", "GGDIIAQAQSGTGKTG", 
"TFVGGTRVQDDLRKLQ", "QGLVLSPTRELALQTA", "DWIAEKLNQSNHTVSS", "NIVINFDLPTNKENYL", 
"AGVIVAVGTPGRVSDV", "SDRERVMNTFRSGSSR", "GFEKPSSIQQRAIAPF", "SGTGKTGAFSIGLLQR", 
"LDTLMDLYETVSIAQS", "VRPIPSFDDMPLHQNL", "MPEEVLELTKKFMRDP", "QQRAIAPFTRGGDIIA", 
"LHEIEAHYHTQIDELP", "LVARGIDVHHVNIVIN", "ANTRRKVDWIAEKLNQ", "VLVLDEADEMLSQGFA", 
"RGALRTESLRVLVLDE", "PQDQDSFLDDQPGVRP", "YGRKGVAINFVTEKDV", "SSKFCETFVGGTRVQD", 
"RVLVTTDLVARGIDVH"), start_position = c(353L, 388L, 79L, 3L, 
296L, 268L, 155L, 111L, 63L, 130L, 96L, 281L, 337L, 146L, 304L, 
45L, 72L, 255L, 22L, 212L, 53L, 379L, 326L, 274L, 174L, 164L, 
9L, 361L, 124L, 319L), score = c(0.92, 0.89, 0.87, 0.87, 0.86, 
0.86, 0.85, 0.85, 0.84, 0.84, 0.79, 0.79, 0.78, 0.78, 0.77, 0.76, 
0.75, 0.75, 0.75, 0.75, 0.74, 0.74, 0.73, 0.72, 0.72, 0.71, 0.68, 
0.67, 0.65, 0.63)), .Names = c("rank", "sequence", "start_position", 
"score"), row.names = c(NA, -30L), class = c("tbl_df", "tbl", 
"data.frame")) 

我想要做的是以下幾點。看看input$rank,我想將input$score下的分數加起來,直到input$rank之下的序列被保留。

作爲一個例子,考慮第一序列,其從 1:36變爲(input$rank下第37值是1 - 請注意,有input$rank下重複值),我將具有26.76的總和 - 我通過做sum(input$score[1:36])獲得了這個。

我想過一個forwhile循環中插入breaknext,雖然我不是那個熟悉的一個循環內的那些參數。

+0

您能添加您的預期輸出嗎? –

+0

它可以是一個向量或另一列,只要訂單保持不變就沒有關係。然後,我將輸出綁定到另一個數據幀 – BCArg

+0

「輸入$ rank下的序列被保留」是什麼意思?另請注意,在您發佈的示例數據中,只有30行。 – AkselA

回答

0

希望這更接近您正在尋找的東西。 我所做的就是測試值小於零的等級向量的差異版本,並對其進行累計求和。然後將結果用作呼叫aggregate()的分組向量。

set.seed(1) 
rank <- c(1, 2, 3, 5, 5, 1, 2, 2, 3, 1, 2, 4, 4, 5) 
score <- round(runif(length(rank)), 2) 
input <- data.frame(rank, score) 
input <- cbind(group=cumsum(c(-1, diff(input$rank)) < 0), input) 
input 
# group rank score 
# 1  1 1 0.27 
# 2  1 2 0.37 
# 3  1 3 0.57 
# 4  1 5 0.91 
# 5  1 5 0.20 
# 6  2 1 0.90 
# 7  2 2 0.94 
# 8  2 2 0.66 
# 9  2 3 0.63 
# 10  3 1 0.06 
# 11  3 2 0.21 
# 12  3 4 0.18 
# 13  3 4 0.69 
# 14  3 5 0.38 

aggregate(score ~ group, data=input, sum) 
# group score 
# 1  1 2.32 
# 2  2 3.13 
# 3  3 1.52 
0
aggregate(input[c(1,4)],by=list(input$rank),sum) 

這是你想要的嗎?

+0

不是真的,不幸的是。從我編輯的答案中,可以看到,考慮到第一個序列,我將輸出26.76,如果使用您的代碼,則此值不存在。除此之外,我總共有65個序列,使用你的代碼的輸出給了我47個序列。 – BCArg