R - Как да сумирате обекти в колона между интервал, определен от условия на друга колона

Това идва като приложение към този въпрос:Суми обект в колона между интервал, определен от друга колона

Това, което бих искал да знам, е как да коригирам отговора, ако искам да сумирам стойностите в 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 е индексът на реда, така че основно да сумирам B редове за A-s, които имат същата стойност + /- 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

Освен това, ако има голяма рамка от данни като тази:

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      -

person Nanami    schedule 02.05.2013    source източник
comment
Можете ли да бъдете по-ясни как вторият df възниква от първия? Искам сума в движещ се прозорец с A +-1, лесно е, но какво имаш предвид под това да не сумираш един и същ ред два пъти? Трудно ми е да видя какво ви трябва.   -  person Maxim.K    schedule 02.05.2013
comment
Така че за A=1 просто сумирам стойностите в B за ред 1 и 2 в първия df, за 3 и 4 сумирам редове 3,4,5 от първия df. Тъй като ред 5 вече е добавен, ред 6 остава същият.   -  person Nanami    schedule 02.05.2013


Отговори (2)


Опитайте следното, като приемем, че оригиналната ви рамка с данни е 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
}

Знам, че това е доста объркан код, но е доста труден проблем предвид всички различни индекси.

person Thomas    schedule 02.05.2013
comment
Това работи добре за рамка с данни само с две колони, но какво ще стане, ако df ще има 4 колони и искам да имам тази информация в новия df, z? Ще добавя пример към въпроса. - person Nanami; 02.05.2013
comment
Искате ли да сумирате всяка от колоните поотделно? Тогава просто бихте добавили колони към z и промените този ред z[j,] <- c(i,sum(df2[df2$A %in% c(i-1,i,i+1),2])), за да имате допълнителни елементи, отнасящи се до всяка колона от оригиналната рамка с данни, като: z[j,] <- c(i,sum(df2[df2$A %in% c(i-1,i,i+1),2]), sum(df2[df2$A %in% c(i-1,i,i+1),3])), за да получите сумите за колони 2 и 3, съответно. - person Thomas; 02.05.2013

Бих създал for цикъл, който тества дали A[i] - A[i-1] отговаря на вашите критерии.

Ако това е вярно, той добавя b[i] към сумарна променлива и повтаря пътя си.

Тъй като аз просто итерирам през A[], не трябва да брои нищо от B[] два пъти.

person Keith    schedule 02.05.2013