R中的条件滚动和循环

R中的条件滚动和循环,r,R,我正在寻找某种类型的条件滚动和,我认为while循环可以满足我的需要,但我在实现它时遇到了困难。因此这应该类似于PCAR[1]*time[1]+PCAR[2]*time[2]+PCAR[3]*time[3]等,[]引用列中的行,这将循环,直到累计时间值达到% 分组依据(世纪=切割(累积时间,断裂=顺序(0,最大值(累积时间),100))%>% 变异(ROLLSUM=rev(累积累积(PCAR*时间)))%>% 切片最大值(order\U by=ROLLSUM,n=1)%>% 拉动(滚动总和)%%

我正在寻找某种类型的条件滚动和,我认为while循环可以满足我的需要,但我在实现它时遇到了困难。因此这应该类似于PCAR[1]*time[1]+PCAR[2]*time[2]+PCAR[3]*time[3]等,[]引用列中的行,这将循环,直到累计时间值达到% 分组依据(世纪=切割(累积时间,断裂=顺序(0,最大值(累积时间),100))%>% 变异(ROLLSUM=rev(累积累积(PCAR*时间)))%>% 切片最大值(order\U by=ROLLSUM,n=1)%>% 拉动(滚动总和)%%>% df$ROLLSUM您可以尝试以下方法:

# Get cumulative sums by group (assuming per century groups)
df <- df %>% 
  group_by(Century = cut(cumulative.time, 
                         breaks = seq(0, max(cumulative.time), 100))) %>%
  mutate(ROLLSUM = rev(cumsum(PCAR * time)))

# Get maximum of each group
groupMaxima <- df %>%
  slice_max(order_by = ROLLSUM, n = 1) %>%
  pull(ROLLSUM)

# Fill column as desired
df$ROLLSUM <- c(groupMaxima, rep(NA, nrow(df) - length(groupMaxima)))  
编辑:

对于这种特殊情况:

MBA <- function(data) {
  require(dplyr)
  data <- data %>% mutate(PCAR = ((lead(depth.along.core) - depth.along.core )/(lead(Age.cal.BP) - Age.cal.BP))*AFBD*assumed.C*10000,
                  PCA_NCP = PCAR*(lead(Age.cal.BP)-Age.cal.BP), 
                  PCA_NCP[is.na(PCA_NCP)] <- 0, 
                  CCP_Bottom_Up = rev(cumsum(rev(PCA_NCP))),
                  CCP_Top_Down = CCP_Bottom_Up[1]- CCP_Bottom_Up) 
  
  data <- data %>%
    group_by(CTIME = cut(cumsum(cumulative.time), 
                         breaks = seq(0, max(cumsum(cumulative.time), na.rm = T), 100))) %>%
    mutate(ROLLSUM = rev(cumsum(PCAR*time))) 
  
  groupMaxima <- data %>% slice_max(order_by = ROLLSUM, n = 1) %>%
    pull(ROLLSUM)
  
  data$ROLLSUM <- c(groupMaxima, rep(NA, nrow(data) - length(groupMaxima)))
  data
}
MBA%
拉动(滚动总和)
data$ROLLSUM您可以尝试以下方法:

# Get cumulative sums by group (assuming per century groups)
df <- df %>% 
  group_by(Century = cut(cumulative.time, 
                         breaks = seq(0, max(cumulative.time), 100))) %>%
  mutate(ROLLSUM = rev(cumsum(PCAR * time)))

# Get maximum of each group
groupMaxima <- df %>%
  slice_max(order_by = ROLLSUM, n = 1) %>%
  pull(ROLLSUM)

# Fill column as desired
df$ROLLSUM <- c(groupMaxima, rep(NA, nrow(df) - length(groupMaxima)))  
编辑:

对于这种特殊情况:

MBA <- function(data) {
  require(dplyr)
  data <- data %>% mutate(PCAR = ((lead(depth.along.core) - depth.along.core )/(lead(Age.cal.BP) - Age.cal.BP))*AFBD*assumed.C*10000,
                  PCA_NCP = PCAR*(lead(Age.cal.BP)-Age.cal.BP), 
                  PCA_NCP[is.na(PCA_NCP)] <- 0, 
                  CCP_Bottom_Up = rev(cumsum(rev(PCA_NCP))),
                  CCP_Top_Down = CCP_Bottom_Up[1]- CCP_Bottom_Up) 
  
  data <- data %>%
    group_by(CTIME = cut(cumsum(cumulative.time), 
                         breaks = seq(0, max(cumsum(cumulative.time), na.rm = T), 100))) %>%
    mutate(ROLLSUM = rev(cumsum(PCAR*time))) 
  
  groupMaxima <- data %>% slice_max(order_by = ROLLSUM, n = 1) %>%
    pull(ROLLSUM)
  
  data$ROLLSUM <- c(groupMaxima, rep(NA, nrow(data) - length(groupMaxima)))
  data
}
MBA%
拉动(滚动总和)

data$ROLLSUM有多种方法,如果你的步数实际上是100年的步数,并且值以恒定的间隔变为0,20,40,那么你可以本机执行此操作:

steps = 100
intervals = 20
ratio = steps / intervals
columns = df[,c("PCAR","time")] 
indices = rep(ratio,nrow(df)) %>% cumsum
    
PCAR_BIN = lapply(indices,function(x){
             localRange = (x-ratio):x
             sum(columns[localRange,1] * columns[localRange,2])
           })%>% unlist
我们现在可以绑定
PICAR\u BIN

df = cbind(df,PICAR_BIN)

有很多方法,如果你的步数实际上是100年的步数,并且值以恒定的间隔变为0,20,40,那么你可以通过本机实现这一点:

steps = 100
intervals = 20
ratio = steps / intervals
columns = df[,c("PCAR","time")] 
indices = rep(ratio,nrow(df)) %>% cumsum
    
PCAR_BIN = lapply(indices,function(x){
             localRange = (x-ratio):x
             sum(columns[localRange,1] * columns[localRange,2])
           })%>% unlist
我们现在可以绑定
PICAR\u BIN

df = cbind(df,PICAR_BIN)

您好,谢谢您的回答,我应该在我的问题中说,我的实际累积时间不是在设定的时间间隔内,它来自放射性碳日期的贝叶斯模型,因此是相当随机的,小数点后6位,我可能在我的示例数据中过度简化了它。我尝试将martins answer添加到我的函数中,但它返回错误:
mutate()
input
Century
。x‘to’必须是一个有限数。我想这可能是因为我的累积时间数据没有落在100。好吧,试着用
dput(head(yourData))
给我们一个你真实数据的快照。嗨,马丁,非常感谢你的帮助,它就到了。我不知道我可以像那样使用dput,非常有用!请查看编辑。因此,您希望将值相加,直到累积时间达到100,然后从零开始,直到下一个总持续时间达到100?嗨,Martin,是的,这就像您第一次向我展示的最大值为0-100,然后是100-200等。它与示例数据完美配合。第一个错误是由于实际数据中的最终值为NA,因此我使用slice删除该行,因为它仅用于前几次计算。现在我正试图将你的代码的最后一部分合并到我的函数中。嗨,谢谢你的两个答案,我应该在我的问题中说,我的实际累积时间不是在设定的时间间隔内,它来自放射性碳日期的贝叶斯建模,因此是相当随机的,小数点后6位,在我的示例数据中,我可能会过度简化它。我尝试将martins answer添加到我的函数中,但它返回错误:
mutate()
input
Century
。x‘to’必须是一个有限数。我想这可能是因为我的累积时间数据没有落在100。好吧,试着用
dput(head(yourData))
给我们一个你真实数据的快照。嗨,马丁,非常感谢你的帮助,它就到了。我不知道我可以像那样使用dput,非常有用!请查看编辑。因此,您希望将值相加,直到累积时间达到100,然后从零开始,直到下一个总持续时间达到100?嗨,Martin,是的,这就像您第一次向我展示的最大值为0-100,然后是100-200等。它与示例数据完美配合。第一个错误是由于实际数据中的最终值为NA,因此我使用slice删除该行,因为它仅用于前几次计算。现在我正试图将代码的最后一部分合并到我的函数中。