извлеките метку времени определенного элемента из фрейма данных/таблицы

#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 .