#r #dataframe #time-series
Вопрос:
У меня есть набор данных, состоящий из 2 столбцов и около 12 тысяч строк. Он имеет такую форму
timestamp track 0.006 A 0.185 R 0.210 A 0.221 R 0.285 A 0.387 R 0.405 R 0.412 R 0.436 A 0.458 A 0.482 A
Поэтому я хочу сначала извлечь все метки времени, где мой трек равен A, что я легко сделал, используя функцию so base R
track_data = subset(df, df$track == 'A') track_time = track_data$V1
теперь я хочу извлечь метку времени последнего трека = R непосредственно перед последним треком = A, если какой-либо R основан, если не ставить метку времени = 0
так что в моем случае, например, это было бы:
(0, 0.185, 0.221, 0.412, 0.412, 0.412, …)
очевидно, что у меня должен быть вектор, содержащий столько элементов, сколько их в векторе трека.
Я попытался сделать цикл, но результат совершенно не совместим с тем, что я ищу.
for (i in 1 : length(df$track)) { if (df$track[i] == 'A') x = last(df$track[i] == 'R') vect = c(vect,x) }
какая-нибудь помощь, пожалуйста?
Ответ №1:
основание R
Мы можем создать вектор временных меток just-R, а затем использовать zoo::na.locf
(последнее перенесенное наблюдение), чтобы каскадировать его в строки A.
ifelse(dat$track == "R", dat$timestamp, NA) # [1] NA 0.185 NA 0.221 NA 0.387 0.405 0.412 NA NA NA zoo::na.locf(ifelse(dat$track == "R", dat$timestamp, NA), na.rm = FALSE) # [1] NA 0.185 0.185 0.221 0.221 0.387 0.405 0.412 0.412 0.412 0.412 dat$newcol lt;- zoo::na.locf(ifelse(dat$track == "R", dat$timestamp, NA), na.rm = FALSE) dat$newcol lt;- ifelse(is.na(dat$newcol), 0, dat$newcol) dat # timestamp track newcol # 1 0.006 A 0.000 # 2 0.185 R 0.185 # 3 0.210 A 0.185 # 4 0.221 R 0.221 # 5 0.285 A 0.221 # 6 0.387 R 0.387 # 7 0.405 R 0.405 # 8 0.412 R 0.412 # 9 0.436 A 0.412 # 10 0.458 A 0.412 # 11 0.482 A 0.412 subset(dat, track == "A") # timestamp track newcol # 1 0.006 A 0.000 # 3 0.210 A 0.185 # 5 0.285 A 0.221 # 9 0.436 A 0.412 # 10 0.458 A 0.412 # 11 0.482 A 0.412
dplyr
library(dplyr) dat %gt;% mutate( newcol = coalesce( zoo::na.locf(if_else(track == "R", timestamp, NA_real_), na.rm = FALSE), 0) ) %gt;% filter(track == "A")
coalesce
является функцией, которая возвращает первый аргумент, не являющийся NA
аргументом, поэтому он заменяет наш ifelse(is.na(newcol),...)
из базы R.
данные.таблица
library(data.table) datDT[, newcol := fcoalesce( nafill(fifelse(track == "R", timestamp, NA_real_), type = "locf"), 0)]
data.table
имеет свое собственное nafill
, которое заменяет необходимость zoo::na.locf
, а также свое fifelse
и fcoalesce
.