Как разделить данные на основе числовых критериев в именах столбцов в R? - PullRequest
1 голос
/ 04 мая 2020

Проблема: У меня есть данные временного ряда, которые я хотел бы разбить на подмножества на основе времени начала и окончания, которое отличается для каждой строки. Каждая временная точка имеет значение для каждой строки (например, в столбцах от «значение_1» до «значение_5»).

df <- data.frame(ID = c(101, 102, 103, 104, 105),
                 start = c(1, 2, 1, 3, 2),
                 end = c(2, 4, 3, 4, 3),
                 value_1 = c(8, 10, 4, 7, 6),
                 value_2 = c(3, 6, 9, 2, 5),
                 value_3 = c(4, 4, 10, 1, 6),
                 value_4 = c(5, 7, 8, 9, 2),
                 value_5 = c(4, 6, 3, 8, 10))
df

#    ID start end value_1 value_2 value_3 value_4 value_5
# 1 101     1   2       8       3       4       5       4
# 2 102     2   4      10       6       4       7       6
# 3 103     1   3       4       9      10       8       3
# 4 104     3   4       7       2       1       9       8
# 5 105     2   3       6       5       6       2      10

Цель: Я хотел бы создать фрейм данных, который только возвращает значения для столбцов между временем начала и окончания (включительно) для каждой строки и возвращает NA для любых построчных значений вне времени начала и окончания, как таковые:

#    ID start end value_1 value_2 value_3 value_4 value_5
# 1 101     1   2       8       3      NA      NA      NA
# 2 102     2   4      NA       6       4       7      NA
# 3 103     1   3       4       9      10      NA      NA
# 4 104     3   4      NA      NA       1       9      NA
# 5 105     2   3      NA       5       6      NA      NA

Я, честно говоря, не уверен, какой маршрут Чтобы попытаться решить эту проблему, я с нетерпением жду любых идей. Я впервые задаю здесь вопрос, поэтому, если вам нужна дополнительная информация или если что-то непонятно, дайте мне знать. Спасибо!

1 Ответ

3 голосов
/ 04 мая 2020

Мы можем преобразовать форму в «длинный» формат, а затем преобразовать его обратно после преобразования

library(dplyr)
library(tidyr)
df %>%
   pivot_longer(starts_with('value')) %>%
   group_by(ID) %>%
   mutate(value = replace(value,
           !row_number() %in% first(start):first(end), NA)) %>% 
   ungroup %>%
   pivot_wider(names_from = name, values_from = value)
# A tibble: 5 x 8
#     ID start   end value_1 value_2 value_3 value_4 value_5
#  <dbl> <dbl> <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
#1   101     1     2       8       3      NA      NA      NA
#2   102     2     4      NA       6       4       7      NA
#3   103     1     3       4       9      10      NA      NA
#4   104     3     4      NA      NA       1       9      NA
#5   105     2     3      NA       5       6      NA      NA

Или в base R с apply

df[-1] <-  t(apply(df[-1], 1, function(x) {
     x[-(1:2)] <- replace(x[-(1:2)], !seq_along(x[-(1:2)]) %in% x[1]:x[2], NA)
     x}))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...