Как изменить столбец с данным кадром, который имеет условия? - PullRequest
0 голосов
/ 29 мая 2018

У меня есть фрейм данных с двумя столбцами.Первый столбец представляет собой временную метку, а второй столбец представляет собой некоторое значение.Например:

library(tidyverse)
set.seed(123)
data_df <- tibble(t = 1:15,
                  value = sample(letters, 15))

У меня есть другой фрейм данных, который определяет диапазон временных меток, которые необходимо обновить, и их соответствующие значения.Например:

criteria_df <- tibble(start = c(1, 3, 7),
                      end = c(2, 5, 10),
                      value = c('a', 'b', 'c')
                      )

Это означает, что мне нужно изменить столбец значений в data_df, чтобы его значение от t = 1 до t = 2 было «a», от t = 3 до t = 5 -«b» и от t = 7 до t = 10 - это «c».

Каков рекомендуемый способ сделать это в R?

Единственный способ, которым я мог придумать, - это циклкаждую строку в критерий_данных и мутируйте столбец значений в data_df после фильтрации столбца t, например:

library(iterators)
library(foreach)

foreach(row = row_iter, .combine = c) %do% {
  seg_start = row$start
  seg_end = row$end
  new_value = row$value

  data_df %<>%
    mutate(value = if_else(between(t, seg_start, seg_end),
                                    new_value,
                                    value))
  NULL
}

1 Ответ

0 голосов
/ 29 мая 2018

Мы можем сделать двухшаговое решение base R, где мы сначала находим значения, которые лежат в диапазоне criteria_df start и end, а затем заменяем data_df value на его эквивалент criteria_df s value, если он совпадает или оставить его как есть.

inds <- sapply(data_df$t, function(x) criteria_df$value[x >= criteria_df$start 
                                                      & x <= criteria_df$end])

data_df$value <- unlist(ifelse(lengths(inds) > 0, inds, data_df$value))
data_df

#      t value
#   <int> <chr>
# 1     1 a    
# 2     2 a    
# 3     3 b    
# 4     4 b    
# 5     5 b    
# 6     6 a    
# 7     7 c    
# 8     8 c    
# 9     9 c    
#10    10 c    
#11    11 p    
#12    12 g    
#13    13 r    
#14    14 s    
#15    15 b    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...