问题描述
在数据集中,我需要将 value
列中的值转换为缺失值,有两种情况:
- 如果按类型分组,则该行为最后一行
- 如果按类型分组,下一行是缺失值
这解决了第一部分:
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]