Форматировать данные от длинных до широких по значениям с помощью NA - PullRequest
0 голосов
/ 28 декабря 2018

Я конвертирую из длинного в широкий формат со значениями NA.И пытается добавить новые строки, которые выполняют операции, которые «пропускают» значения NA.

Я могу использовать spread(), но в конечном итоге хочу выполнить операции с каждым измерением, которое собирается за несколько лет.В приведенном ниже примере это может содержать два или более значений.Например, meas == 4 содержит три значения, в то время как другие измерения содержат два:

df <- data.frame(meas=c(1,1,1,2,2,2,3,3,3,4,4,4), 
             year=rep(c("y2016", "y2017","y2018")), 
             value=c(1,2,NA,NA,1,4,1,NA,3,1,5,10))

spread(df, year, value)
  meas y2016 y2017 y2018
1    1     1     2    NA
2    2    NA     1     4
3    3     1    NA     3
4    4     1     5    10

В конечном итоге я ищу что-то среднее между длинным и широким набором данных, как показано здесь:

  meas year1 year2 value1 value2
1    1  2016  2017      1      2
2    2  2017  2018      1      4
3    3  2016  2018      1      3
4    4  2016  2017      1      5
5    4  2017  2018      5     10

1 Ответ

0 голосов
/ 28 декабря 2018

Не думаю, что вам нужно поворачивать data.frame, достаточно вдумчиво использовать lead:

df %>%
  mutate(year = stringr::str_extract(year, "[0-9]+")) %>%
  filter(!is.na(value)) %>%
  group_by(meas) %>%
  mutate(year2 = lead(year),
         value2 = lead(value, order_by = year)) %>%
  filter(!is.na(value2)) %>%
  select(meas, year, year2, value, value2)

# A tibble: 5 x 5
# Groups:   meas [4]
   meas year  year2 value value2
  <dbl> <chr> <chr> <dbl>  <dbl>
1     1 2016  2017      1      2
2     2 2017  2018      1      4
3     3 2016  2018      1      3
4     4 2016  2017      1      5
5     4 2017  2018      5     10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...