For/while 循环直到序列被维护
For/ while loops until sequence is maintained
我有一个如下所示的数据框:
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])
.
获得的
我考虑过在 for
或 while
循环中插入 break
或 next
,尽管我对循环中的那些参数不是很熟悉。
aggregate(input[c(1,4)],by=list(input$rank),sum)
这是你想要的吗?
希望这更接近您要查找的内容。
我所做的是针对小于零的值测试秩向量的不同版本,并对其进行累加和。然后在对 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
我有一个如下所示的数据框:
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])
.
我考虑过在 for
或 while
循环中插入 break
或 next
,尽管我对循环中的那些参数不是很熟悉。
aggregate(input[c(1,4)],by=list(input$rank),sum)
这是你想要的吗?
希望这更接近您要查找的内容。
我所做的是针对小于零的值测试秩向量的不同版本,并对其进行累加和。然后在对 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