【问题标题】:Transform value into missing by position按位置将值转换为缺失
【发布时间】:2021-05-06 10:25:29
【问题描述】:

在数据集中,我需要转换为缺少value 列中的值,有两种情况:

  1. 如果按类型分组,则该行是最后一行
  2. 如果按类型分组,下一个值行是缺失值

这就解决了第一部分:

toy %>% 
  group_by(type) %>%
  mutate(value = ifelse(row_number()==max(row_number()),NA,value))

我该如何处理第二个问题?提前致谢

toy <- data_frame(type=c(rep("A",4),rep("B",4)),year=rep(c(1:4),2),value=c(1,1,NA,1,1,1,1,1))

# A tibble: 8 x 3
  type   year value
  <chr> <int> <dbl>
1 A         1     1
2 A         2     1
3 A         3    NA
4 A         4     1
5 B         1     1
6 B         2     1
7 B         3     1
8 B         4     1


expected <- data_frame(type=c(rep("A",4),rep("B",4)),year=rep(c(1:4),2),value=c(1,NA,NA,NA,1,1,1,NA))

  type   year value
  <chr> <int> <dbl>
1 A         1     1
2 A         2    NA
3 A         3    NA
4 A         4    NA
5 B         1     1
6 B         2     1
7 B         3     1
8 B         4    NA

【问题讨论】:

    标签: r dplyr tidyverse missing-data


    【解决方案1】:

    使用lead 可以结合这两个条件:

    library(dplyr)
    
    toy %>%
      group_by(type) %>%
      mutate(value = replace(value, is.na(lead(value)), NA)) %>%
      ungroup
    
    #  type   year value
    #  <chr> <int> <dbl>
    #1 A         1     1
    #2 A         2    NA
    #3 A         3    NA
    #4 A         4    NA
    #5 B         1     1
    #6 B         2     1
    #7 B         3     1
    #8 B         4    NA
    

    lead 将给出下一个值,如果是NA,我们将当前值更改为NA。同样lead 默认返回最后一个值为NA,因此第一个条件(If grouping by type, the line is the last line)自动满足。


    同样可以用data.table解决:

    library(data.table)
    
    setDT(toy)[,value := replace(value, is.na(shift(value, type = 'lead')),NA), type]
    

    【讨论】:

      猜你喜欢
      • 2014-01-08
      • 1970-01-01
      • 2021-07-22
      • 2011-09-17
      • 1970-01-01
      • 2018-09-21
      • 2021-01-02
      • 1970-01-01
      • 2014-06-13
      相关资源
      最近更新 更多