我在R中工作,我有一个 Dataframe ,其中有一个DateTime列和一个Binary列,按时间标记一个事件,如示例 Dataframe 所示:
DateTime <- seq(from = as.POSIXct("2021-01-01 00:00:00"), to = as.POSIXct("2021-01-01 17:00:00"), by = "hour")
Binary <- c(NA, 1, rep(NA, 5), 1, rep(NA, 5), 1, rep(NA, 4))
sample <- data.frame(DateTime, Binary)
我想创建一个新列,分配“H”,其中“1”在Binary列中指示,以及x个行数,其中“1”指示。对于此示例,上面和下面各1行,如“目标”数据框所示:
Height <- c(rep('H', 3), rep(NA, 3), rep('H',3), rep(NA, 3), rep('H', 3), rep(NA, 3))
goal <- data.frame(DateTime, Binary, Height)
我可以使用for循环来实现这一点,但是,由于我拥有的实际数据集非常大(几乎有100万个观测值),所以速度非常慢,下面是我使用的for循环的一个例子:
# create new column Height
sample$Height <- NA
# Use a for loop to assign H
for (i in 1 : length(sample$Height)){
if(sample$Binary[i] %in% c(1)){sample$Height [i] <- "H"}
if(sample$Binary[i] %in% c(1)){sample$Height [i+1] <- "H"}
if(sample$Binary[i] %in% c(1)){sample$Height [i-1] <- "H"}
}
我可以使用dplyr在Binary列中有“1”的行中赋值“H”。
sample <- sample %>%
mutate(Height = ifelse(sample$Binary==1,'H', NA))
但是,有没有办法也填充指定数量的行(在此之上和之下)?
我还考虑过在上面的步骤之后使用fill():
sample <- fill(sample$Height, .direction="updown")
但当然,这填补了所有NA的,我不希望...
1条答案
按热度按时间bvuwiixz1#