Мы можем создать столбец группировки на основе вхождения элементов только чисел (\\d+
) в «X1», получить кумулятивную сумму, создать «Date» как элемент first
для «X1», ungroup
и удалите строки NA
library(dplyr)
library(stringr)
a %>%
group_by(grp = cumsum(str_detect(X1, '^\\d+$'))) %>%
mutate(Date = first(X1)) %>%
ungroup %>%
select(-grp) %>%
na.omit
# A tibble: 7 x 3
# X1 X2 Date
# <chr> <int> <chr>
#1 abc 10 2001
#2 def 12 2001
#3 xo 13 2001
#4 abc 10 2002
#5 efd 22 2002
#6 dd 23 2002
#7 a 30 2005
Или используя data.table
с zoo
library(data.table)
library(zoo)
na.omit(setDT(a)[, Date := na.locf(fifelse(is.na(X2), X1, NA_character_))])
data
a <- structure(list(X1 = c("2001", "abc", "def", "xo", "2002", "abc",
"efd", "dd", "2005", "a"), X2 = c(NA, 10L, 12L, 13L, NA, 10L,
22L, 23L, NA, 30L)), class = "data.frame", row.names = c(NA,
-10L))