我的数据框是这样的
df <- read.table(text="
id nr date
1 124 1 2017-01-01
2 122 1 2017-01-03
3 124 2 2017-01-04
4 121 1 2017-02-05
5 124 3 2017-02-06
6 124 3 2017-04-06
", header=TRUE)
我必须从我的数据框中删除天数差异小于 30 天的行。我通常用 lead 函数来做,然后我计算天数差异,如果它低于限制,那么我将其删除。
但现在我想删除低于限制的每一行。不仅如此;如果它的日期之间的日期差异超过 30 天,那么我必须过滤所有低于限制的下一行。
换句话说,有第一行,应该删除第 2 行和第 3 行,因为日期差异只有几天。第 4 行和第 1 行之间的差异超过 30 天,因此不应删除,第 4 行和第 5 行之间的差异小于 30 天,因此将其删除,结果中应该存在 6,因为差异超过 30 天等等上。
最佳答案
也许有更简单的算法,但这个算法做到了。
remove_dates <- function(DF, col = "date", lim = 30){
n <- nrow(DF)
log_inx <- !logical(n)
i <- 1
j <- 2
while(i < n & j <= n){
d <- difftime(DF[j, col], DF[i, col], unit = "days")
if(d < lim){
log_inx[j] <- FALSE
j <- j + 1
}else{
i <- j
j <- j + 1
}
}
DF[log_inx, ]
}
remove_dates(df)
# id nr date
#1 124 1 2017-01-01
#4 121 1 2017-02-05
#6 124 3 2017-04-06
请注意,上面的函数可以在包magrittr
管道中使用,%>%
。
library(dplyr)
df %>% remove_dates()
# id nr date
#1 124 1 2017-01-01
#4 121 1 2017-02-05
#6 124 3 2017-04-06
关于R - 从数据框中删除差异小于 30 天的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55991198/