这是数据框
sampledf = data.frame(timeinterval = c(1:120), hour = c(rep(NA, times = 85), 1, rep(NA, times = 5), 1, rep(NA, times = 4),1, rep(NA, times = 4), 1, rep(NA, times = 18)))
我想替换列小时中的NA,以使第86行和92(含)之间,然后97和102(含)之间的值都为1。
这是到目前为止我尝试过的: 1.在小时列中获取值为1的行名列表 2.遍历(这是行不通的!)
ones = which(sampledf$hour == 1)
n = (length(ones)+1)/2
chunk <- function(ones,n) split(ones, cut(seq_along(ones), n, labels = FALSE))
y = chunk(ones,n)
for (i in y) {
sampledf$Hour[c(y$i[1]:y$i[2])] == 1
}
帮帮我,我是R的新手。
在python中,我们有ffill方法,这里等效吗?
谢谢!
答案 0 :(得分:0)
sampledf$hour[between(sampledf$timeinterval,86,92) | between(sampledf$timeinterval,97,102)]<-1
基本上,您通过timeinterval为between
86-92或(|
)92-102的情况来对sampledf的小时列进行子集化,并为所有这些情况分配1。
答案 1 :(得分:0)
如果要为给定范围内的所有时间间隔分配1:
sampledf$hour[sampledf$timeinterval %in% c(86:92,97:102)] <- 1
如果您要根据数据的行号将1分配给个案:
sampledf$hour[c(86:92,97:102)] <- 1
如果您要像注释中一样向值添加累计和,则可以使用cumsum()
函数并执行:
sampledf$hour[which(sampledf$hour == 1)] <- cumsum(sampledf$hour[which(sampledf$hour == 1)])