R:用数字替换两个数字之间的值

时间:2018-10-31 13:12:09

标签: r dataframe

这是数据框

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方法,这里等效吗?

谢谢!

2 个答案:

答案 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)])