R:从A列到B列条件值的行总和
我对R很陌生,似乎不知道如何处理一个相对简单的问题。我想对每个“试验索引”的“持续时间”列的行进行求和,但仅对“X位置”值增加的第一行进行求和。我只想对X增加的试验中的第一轮进行求和。 简化数据帧的第一行:R:从A列到B列条件值的行总和,r,dplyr,R,Dplyr,我对R很陌生,似乎不知道如何处理一个相对简单的问题。我想对每个“试验索引”的“持续时间”列的行进行求和,但仅对“X位置”值增加的第一行进行求和。我只想对X增加的试验中的第一轮进行求和。 简化数据帧的第一行: TRIAL_INDEX DURATION X_POSITION 1 1 204 314.5 2 1 172 471.6 3 1 186 5
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
因此,对于试验索引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))
非常感谢您的帮助和建议!以下是您可以使用
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(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
库(dplyr)
df%
突变(x.increating=ifelse(x_位置>滞后(x_位置),真,假),
x、 递增=ifelse(is.na(x.increating),TRUE,x.increating))%>%
过滤器(x.R==TRUE)%>%
总结(第一次通过时间=总结(X位置))
物件
#来源:本地数据帧[2 x 2]
#
#试用索引首次通过时间
#(dbl)(dbl)
#1 1 1356.5
#2 2 1365.8
库(data.table)
dt=as.data.table(df)#或就地转换的setDT
#查找将用于求和持续时间的行
idx=dt[,.I[1]:.I[min(.N,其中(差值(X_位置)<0),na.rm=T)],by=TRIAL_INDEX]$V1
#对这些行的持续时间求和
dt[idx,time:=sum(DURATION),by=TRIAL_INDEX][,time:=time[1],by=TRIAL_INDEX]
dt
#试验指数持续时间X位置时间
#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
你的X_位置
不是数字,那么你怎么能期望R知道它是否在增加?我猜它使用了基本的整数表示法(如果是这些因素的话)并抛出警告。例如,请参阅。谢谢David,说得好。我将X_位置值更改为数字值,这是初学者在读取数据时犯的一个小错误。但是,似乎没有得到我想要的输出…如果我正确读取OP,这不是他们想要的。将位置的第5行值更改为600并运行此操作。如何跳过DURA中的NATION?Eddi,这太好了,非常感谢!我一直在尝试编写循环,它非常慢,这是一种快速而短的方式。
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