如果A列具有值,则汇总B列中的变量,直到出现A列中的下一个变量 结果数据

我进行了一个实验,人们在立方体周围移动,直到他们做出自己喜欢的图形为止。当他们喜欢一个图形时,他们会保存并创建一个新图形。该脚本跟踪了所有数字保险箱之间的移动时间和移动次数。

我现在有一个(A)列,其中每个保存之间的移动次数,以及一个(B)列,其中每个动作之间的时间直到保存该图形。因此,A列填充有NA,然后是一个数字(表示图形安全),B列的所有行(第一行除外)都有以秒为单位的时间,表示所有移动。

数据摘录:

A   B           C

NA  1.6667798   
NA  3.3326443   
NA  3.5506110   
NA  11.4995562  
NA  1.4334849   
NA  4.9502637   
NA  2.1161980   
NA  4.7833326   
NA  2.8500842   
NA  4.0331373   
NA  4.3498785   
12  5.0910905   Sum

NA  4.2424078   
NA  1.7332665   
NA  1.5341006   
3   4.8923275   Sum

NA  4.1064621   
NA  3.3498289   
NA  1.6002373   
3   6.0122170   Sum 

我尝试了几种循环选项,但似乎无法使其正常运行。 我做了这个循环,但是它没有在C列中进行正确的计算。

data$C <- rep(NA,nrow(data))

for (i in unique(data$id)) {
  C <- which(data$id == i & data$type == "moveblock")
  for (e in 1:length(C)){
    if (e == 1){
    data$C[C[e]] = C[e] - which(data$id == i)[1]  
    }
    else if (e > 1){
    data$C[C[e]] = C[e] + C[e+1]+1}
  } 

  d_times <- which(data$id == i)
  for (t in 2:length(d_times)){
    data$B[d_times[t]] <- data$time[d_times[t]] - data$time[d_times[t-1]]
  }
}

我想要一个新列(C),它具有从B列到保存一个图形为止的所有行的总和= A列中的一个数字。换句话说,我想计算对象花费的总时间在保存图形之前进行所有移动。

希望任何人都可以解决!

hfny718hf 回答:如果A列具有值,则汇总B列中的变量,直到出现A列中的下一个变量 结果数据

我们可以根据非NA值的出现来创建组,并采用sum

library(dplyr)
df %>% 
 group_by(group = lag(cumsum(!is.na(A)),default = 0)) %>% 
 summarise(sum = sum(B,na.rm = TRUE))

#  group   sum
#  <dbl> <dbl>
#1     0  49.7
#2     1  12.4
#3     2  15.1

在基数R中,我们可以使用aggregate来完成

aggregate(B~c(0,head(cumsum(!is.na(A)),-1)),df,sum,na.rm = TRUE)

数据

df <- structure(list(A = c(NA,NA,12L,3L,3L),B = c(1.6667798,3.3326443,3.550611,11.4995562,1.4334849,4.9502637,2.116198,4.7833326,2.8500842,4.0331373,4.3498785,5.0910905,4.2424078,1.7332665,1.5341006,4.8923275,4.1064621,3.3498289,1.6002373,6.012217
)),class = "data.frame",row.names = c(NA,-20L))
,

您可以在句点(即seq间隔)之外创建一个矩阵,并相应地对B列的值求和。为此,创建向量saved,该向量指示对象已“保存”的位置,并使用apply()列出序列。最后,sapply()遍历periods列表中的序列。

saved <- which(!is.na(dat$A))
periods <- apply(cbind(c(1,(saved + 1)[-3]),saved),1,function(x) seq(x[1],x[2]))
dat$C[saved] <- sapply(periods,function(x) sum(dat$B[x]))

结果

dat$C
# [1]       NA       NA       NA       NA       NA       NA       NA       NA       NA
# [10]       NA       NA 49.65706       NA       NA       NA 12.40210       NA       NA
# [19]       NA 15.06875

数据

dat <- structure(list(A = c(NA,6.012217
),C = c(NA,NA)),-20L),class = "data.frame")
本文链接:https://www.f2er.com/3138870.html

大家都在问