r - R - 从最后一个非零值开始依次填充 na 值
问题描述
我有一个如下所示的数据框列:
a
<int>
1 11127
2 0
3 0
4 NA
5 0
6 0
7 NA
8 0
9 11580
11 0
12 NA
13 0
我想从最后一个非零值依次填充 NA 值,以便最终结果如下所示:
a
<int>
1 11127
2 0
3 0
4 11128
5 0
6 0
7 11129
8 0
9 11580
11 0
12 11581
13 0
是否有dplyr
(最好)或基本的 R 方式来做到这一点?我宁愿避免使用 for 循环,因为我的行数非常大。
谢谢。
解决方案
一种选择:
library(dplyr)
df %>%
group_by(idx = cumsum(!(is.na(a) | a == 0)), is.na(a)) %>%
mutate(rn = row_number()) %>%
group_by(idx) %>%
mutate(a = coalesce(a, first(a) + rn)) %>%
ungroup() %>%
select(a)
输出:
# A tibble: 12 x 1
a
<int>
1 11127
2 0
3 0
4 11128
5 0
6 0
7 11129
8 0
9 11580
10 0
11 11581
12 0
如果速度是一个问题,也许data.table
等价的会稍微快一点:
library(data.table)
setDT(df)[, rn := rowid(a), .(cumsum(!(is.na(a) | a == 0)), is.na(a))][
, a := fcoalesce(a, first(a) + rn), by = cumsum(!(is.na(a) | a == 0))][
, rn := NULL]
编辑
IMO 分组然后获取NA
s 的行索引并不是很优雅;cumsum
在其他解决方案(例如使用)中可以看到的效果要好得多。
使用fcoalesce
,然后可以data.table
一步解决问题:
library(data.table)
setDT(df)[, a := fcoalesce(a, first(a) + cumsum(is.na(a))), by = cumsum(!(is.na(a) | a == 0))]
推荐阅读
- python - 无法使用 python xlsxwriter 在 excel 中更改字体颜色
- php - php - create_function 重构
- php - 如何在 wampserver 的 phpadmin 中将此数据数组插入 mysql
- vba - 单击报告背景时出现 MS Access 灰色框
- java - Jolokia 上每个线程的 CPU 使用率?
- java - 使用 MediatorLiveData 合并到 LiveData (Firestore) QuerySnapshot 流会产生奇怪的结果
- python - 如何在具有特定首字母和最后一个字母的字符串中查找子字符串?
- mysql - 使用 SQL 匹配日期
- angular - Angular 5 primeng 中的一列中的两个变量
- azure - 如何在本地传递 cloud-init 文件?