For/ while循环,直到序列保持不变

aurhwmvo  于 2023-05-26  发布在  其他
关注(0)|答案(2)|浏览(149)

我有一个 Dataframe ,如下所示:

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,尽管我对循环中的这些参数并不熟悉。

du7egjpx

du7egjpx1#

希望这更接近你要找的东西。我所做的是测试一个差异版本的秩向量的值小于零,并在此基础上进行累积求和。然后将结果用作对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
fnx2tebb

fnx2tebb2#

aggregate(input[c(1,4)],by=list(input$rank),sum)

这就是你想要的吗

相关问题