簡體   English   中英

R:匯總從A列到B列的條件值之間的行

[英]R: sum rows from column A until conditioned value in column B

我對R很陌生,似乎無法弄清楚如何處理似乎相對簡單的問題。 我想對每個“ TRIAL_INDEX”的“ DURATION”列的行求和,但是只有那些“ X_POSITION”的值在增加的第一行。我只想對X增加的試驗中的第一輪求和。簡化數據框的行:

  TRIAL_INDEX DURATION X_POSITION 
1           1      204      314.5 
2           1      172      471.6             
3           1      186      570.4           
4           1      670      539.5          
5           1      186      503.6          
6           2      134      306.8           
7           2      182      503.3            
8           2      806      555.7           
9           2      323      490.0           

因此,對於TRIAL_INDEX 1,僅應添加DURATION的前三個值(204 + 172 + 186),因為這是X到目前為止具有最高值的位置(逐行遍歷數據幀)。

所需的輸出應類似於:

  TRIAL_INDEX DURATION X_POSITION FIRST_PASS_TIME
1           1      204      314.5             562
2           1      172      471.6             562
3           1      186      570.4             562
4           1      670      539.5             562
5           1      186      503.6             562
6           2      134      306.8            1122
7           2      182      503.3            1122
8           2      806      555.7            1122
9           2      323      490.0            1122

我嘗試使用dplyr生成可以與原始數據幀合並的新數據幀。 但是,該代碼無法正常工作,而且我不確定如何確保僅在每個試驗中添加X_POSITION值增加的第一行。

FirstPassRT = dat %>% 
          group_by(TRIAL_INDEX) %>%
          filter(dplyr::lag(dat$X_POSITION,1) > dat$X_POSITION) %>% 
          summarise(FIRST_PASS_TIME=sum(DURATION)) 

任何幫助和建議,我們將不勝感激!

您可以使用dplyr軟件包嘗試以下方法:

library(dplyr);
dat %>% group_by(TRIAL_INDEX) %>%  
        mutate(IncLogic = X_POSITION > lag(X_POSITION, default = 0)) %>% 
        mutate(FIRST_PASS_TIME = sum(DURATION[IncLogic])) %>% 
        select(-IncLogic)

Source: local data frame [9 x 4]
Groups: TRIAL_INDEX [2]

  TRIAL_INDEX DURATION X_POSITION FIRST_PASS_TIME
        (int)    (int)      (dbl)           (int)
1           1      204      314.5             562
2           1      172      471.6             562
3           1      186      570.4             562
4           1      670      539.5             562
5           1      186      503.6             562
6           2      134      306.8            1122
7           2      182      503.3            1122
8           2      806      555.7            1122
9           2      323      490.0            1122
library(data.table)
dt = as.data.table(df) # or setDT to convert in place

# find the rows that will be used for summing DURATION
idx = dt[, .I[1]:.I[min(.N, which(diff(X_POSITION) < 0), na.rm = T)], by = TRIAL_INDEX]$V1

# sum the DURATION for those rows
dt[idx, time := sum(DURATION), by = TRIAL_INDEX][, time := time[1], by = TRIAL_INDEX]
dt
#   TRIAL_INDEX DURATION X_POSITION time
#1:           1      204      314.5  562
#2:           1      172      471.6  562
#3:           1      186      570.4  562
#4:           1      670      539.5  562
#5:           1      186      503.6  562
#6:           2      134      306.8 1122
#7:           2      182      503.3 1122
#8:           2      806      555.7 1122
#9:           2      323      490.0 1122

如果您想將每個試驗的摘要總結為一行,可以使用如下摘要:

library(dplyr)

df <- data_frame(TRIAL_INDEX = c(1,1,1,1,1,2,2,2,2),
                 DURATION = c(204,172,186,670, 186,134,182,806, 323),
                 X_POSITION = c(314.5, 471.6, 570.4, 539.5, 503.6, 306.8, 503.3, 555.7, 490.0))

res <- df %>%
  group_by(TRIAL_INDEX) %>%
  mutate(x.increasing = ifelse(X_POSITION > lag(X_POSITION), TRUE, FALSE),
         x.increasing = ifelse(is.na(x.increasing), TRUE, x.increasing)) %>%
  filter(x.increasing == TRUE) %>%
  summarize(FIRST_PASS_TIME = sum(X_POSITION))
res

#Source: local data frame [2 x 2]
#
#  TRIAL_INDEX FIRST_PASS_TIME
#        (dbl)           (dbl)
#1           1          1356.5
#2           2          1365.8

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM