2016-05-16 22 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 
相关问题