使用NA将数据格式化为从长到宽的值

时间:2018-12-28 19:00:24

标签: r tidyr spread

我正在将</a>值的 从长格式转换为宽格式。并尝试添加执行“跳过” 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

1 个答案:

答案 0 :(得分:0)

我认为您不需要绕开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