微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

按位置将值转换为缺失值

如何解决按位置将值转换为缺失值

在数据集中,我需要将 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,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",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

解决方法

使用 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]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。