0

这是对这个问题的应用: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,所以基本上对具有相同值 +/- 1 的 As 求和 B 行,但是不是对同一行求和两次?

我尝试构建一个循环函数,但是在将行索引与数据框一起使用时遇到了问题。示例:如果给出以下数据框

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

此外,如果有一个像这样的大数据框:

df
chr     start           stop            m       n       s
chr1    71533361        71533362        23      1       -
chr1    71533361        71533362        24      26      -
chr1    71533361        71533362        25      1       -

我希望我的结果看起来像这样(我选择了 m 列中的值为最大值的行):

df
chr1    71533361        71533362        24      28      -
4

2 回答 2

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
}

我知道这是一种混乱的代码,但考虑到所有不同的索引,这是一个棘手的问题。

于 2013-05-02T08:57:32.883 回答
0

我会创建一个 for 循环来测试 A[i] - A[i-1] 是否符合您的标准。

如果这是真的,它将 b[i] 添加到 sum 变量并重复它的方式。

因为 i 只是遍历 A[] 它不应该从 B[] 计算任何东西两次。

于 2013-05-02T08:28:54.933 回答