我有一个数据集,在某个列值出现后,我想删除其中的行
数据集示例:
a<-data.frame(Account=c('A','A','A','A','A','A','A','A','A'),
ProcessDate=seq(as.Date('2020-01-01'),as.Date('2020-09-01'),by='month'),
Payment=c(1,2,3,4,5,6,7,8,9),
ColumnCriteria=c(610,610,610,610,610,650,610,610,610))
我想删除ColumnCriteria=650之后的行。
我的问题是,我使用的是一个大数据集,所以我不能只将filter
函数与几个lags
一起使用,因为在本例中650的位置对于另一个帐户来说会有所不同。
我想我可能会写一个if_else
语句,如果ColumnCriteria等于650,那么返回Date,然后我可以尝试用该日期填充列,然后过滤ProcessDate较大的行。这看起来有点乱,所以我想我应该联系一下,看看是否有人有任何建议。
谢谢!
考虑slice
:
library(dplyr)
slice(a, 1:which(ColumnCriteria == 650, arr.ind = TRUE))
Account ProcessDate Payment ColumnCriteria
1 A 2020-01-01 1 610
2 A 2020-02-01 2 610
3 A 2020-03-01 3 610
4 A 2020-04-01 4 610
5 A 2020-05-01 5 610
6 A 2020-06-01 6 650
注意:如果截断值出现多次,则此表达式将仅使用该值的第一个实例(按a
的行顺序排序(。
通过使用which()
:创建索引来尝试此base R
解决方案
#Data
a<-data.frame(Account=c('A','A','A','A','A','A','A','A','A'),
ProcessDate=seq(as.Date('2020-01-01'),as.Date('2020-09-01'),by='month'),
Payment=c(1,2,3,4,5,6,7,8,9),
ColumnCriteria=c(610,610,610,610,610,650,610,610,610))
#Index
i <- min(which(a$ColumnCriteria==650))
#Code
a2 <- a[1:i,]
输出:
a2
Account ProcessDate Payment ColumnCriteria
1 A 2020-01-01 1 610
2 A 2020-02-01 2 610
3 A 2020-03-01 3 610
4 A 2020-04-01 4 610
5 A 2020-05-01 5 610
6 A 2020-06-01 6 650
根据您的描述,听起来您需要按Account
操作,并且您的数据是按Payment
隐式排序的,尽管您没有提供足够完整的数据集来真正证明这一点。你熟悉dplyr::group_by()
吗?
a %>%
group_by(Account) %>%
arrange(Payment) %>%
filter(cumsum(tidyr::replace_na(lag(ColumnCriteria == 650), 0)) == 0)
具有match
和seq
的选项
a[seq_len(match(650, a$ColumnCriteria)),]
# Account ProcessDate Payment ColumnCriteria
#1 A 2020-01-01 1 610
#2 A 2020-02-01 2 610
#3 A 2020-03-01 3 610
#4 A 2020-04-01 4 610
#5 A 2020-05-01 5 610
#6 A 2020-06-01 6 650