2016-05-16 62 views
0

我對R很新,似乎無法弄清楚如何處理似乎是一個相對簡單的問題。我想根據'TRIAL_INDEX'對'DURATION'列的行進行求和,但是隻有那些'X_POSITION'值增加的第一行,我只想在X增加的試驗中對第一輪求和 The一個簡化的數據幀的第一行:R:從列A中總結行直到列B中的條件值

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中,僅持續時間的前三個值應該被添加(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)) 

任何幫助和建議,非常感謝!

+0

你'X_POSITION'不是數字,所以R怎麼知道它是否增加?我猜想它使用底層整數表示(如果這些因素)並拋出警告。例如,請參閱[這裏](http://stackoverflow.com/questions/15236440/as-numeric-with-comma-decimal-separators)。 –

+0

感謝大衛,好點。我將X_POSITION值更改爲數字值,這是初學者在讀取數據時的錯誤。仍然,似乎沒有得到我想要的輸出... – Saskia

回答

0
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 
+0

Eddi,這很棒,非常感謝你!我一直在努力編寫循環,這是非常緩慢的,而且這是一個非常快速和簡短的方法。 – Saskia

1

這裏是你可以用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 
+0

如果我正在讀取OP,這不是他們想要的。將第5行的位置值更改爲600並執行此操作。 – eddi

0

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 
相關問題