这是对此问题的应用:Sum object in a column between an interval defined by another column
我想知道的是,如果我想对B中的值求和,对((A[i+1]-A[i]==0)
或(A[i+1]-A[i]==1)
或(A[i]-A[i-1]==0)
或(A[i]-A[i-1]==1))
进行求和,如何调整答案i
是行索引,所以基本上和As的B行相同,它们具有相同的值+/- 1,但不能将相同的行相加两次?
我尝试构建循环函数,但在使用数据帧的行索引时遇到困难。 例: 如果给出以下数据框
df
A B
[1,] 1 4
[2,] 1 3
[3,] 3 5
[4,] 3 7
[5,] 4 3
[6,] 5 2
我想要获得的是下一个数据框:
df
A B
[1,] 1 7
[2,] 3 15
[3,] 5 2
此外,如果a有这么大的数据框:
df
chr start stop m n s
chr1 71533361 71533362 23 1 -
chr1 71533361 71533362 24 26 -
chr1 71533361 71533362 25 1 -
我希望我的结果看起来像这样(我选择了m列中的值为max的行):
df
chr1 71533361 71533362 24 28 -
答案 0 :(得分:1)
假设您的原始数据框为df
:
df2 <- df # create a duplicate df to destroy
z <- data.frame(nrow=length(unique(df$A)), ncol=2) # output dataframe
names(z) <- c("A","B")
j <- 1 # output indexing variable
u <- unique(df$A) # unique vals of A
i <- u[1]
s <- TRUE # just for the while() loop
while(s){
z[j,] <- c(i,sum(df2[df2$A %in% c(i-1,i,i+1),2]))
df2 <- df2[!df2$A %in% c(i-1,i,i+1),]
j <- j + 1 # index the output
u <- u[!u %in% c(i-1,i,i+1)] # cleanup the u vector
if(length(u)==0) # conditionally exit the loop
s <- FALSE
else
i <- min(u) # reset value to sum by
}
我知道这是一种混乱的代码,但考虑到所有不同的索引,这是一个棘手的问题。
答案 1 :(得分:0)
我会创建一个for循环来测试A [i] - A [i-1]是否符合您的标准。
如果这是真的,它会将b [i]添加到sum变量并重复执行。
因为我只是在A []中迭代,所以它不应该从B []计算两次。