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