【问题标题】:Format data long to wide across values with NA使用 NA 将数据从长到宽格式化
【发布时间】:2018-12-28 19:00:23
【问题描述】:

我正在将 从长格式转换为宽格式,并带有 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

【问题讨论】:

  • 你需要dcast(setDT(df), meas ~ rowid(meas), value.var = c('year', 'value'))

标签: r dataframe r tidyr spread


【解决方案1】:

我认为您不需要调整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

【讨论】:

    猜你喜欢
    • 2016-07-12
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    相关资源
    最近更新 更多