我有一个数据框df
。它有几列,其中两列是dates
和serial_day
,对应于观察日期和MATLAB的序列日。我想限制我的时间序列,使得两个连续观察之间的增量(以天为单位)为3或4,并将这些块与NA行分开。
众所周知,连续的每日观察从未发生,2天分离然后2天分离的情况很少见,因此可以忽略不计。
在示例中,为方便起见,显示了increment
,但使用diff
函数可以轻松生成 serial_day increment
1 4 NA
2 7 3
3 10 3
4 12 2
5 17 5
6 19 2
7 22 3
8 25 3
9 29 4
10 34 5
。所以,如果数据框是
serial_day increment
1 4 NA
2 7 3
3 10 3
4 NA ## Entire row of NAs NA
5 19 NA
6 22 3
7 25 3
8 29 4
9 NA ## Entire row of NAs NA
我希望得到一个新的数据框:
scrapy.Request("http://www.example.com.html",callback=parse_page1)`
我无法在没有循环的情况下找到一种方法来做到这一点,这在R中是个坏主意。
答案 0 :(得分:1)
首先检查增量不等于3或4的行。然后用一行NAs
替换这些行:
inds <- which( df$increment > 4 | df$increment < 3 )
df[inds, ] <- rep(NA, ncol(df))
# serial_day increment
# 1 4 NA
# 2 7 3
# 3 10 3
# 4 NA NA
# 5 NA NA
# 6 NA NA
# 7 22 3
# 8 25 3
# 9 29 4
# 10 NA NA
这可能会导致多个连续的NAs
行。为了将这些连续NA
行减少到单个NA
行,您需要检查NA
- 行与which()
的位置,然后查看这些行地点与diff()
是连续的,并从df
NArows <- which(rowSums(is.na(df)) == ncol(df)) # c(4, 5, 6, 10)
inds2 <- NArows[c(FALSE, diff(NArows) == 1)] # c(5, 6)
df <- df[-inds2, ]
# serial_day increment
# 1 4 NA
# 2 7 3
# 3 10 3
# 4 NA NA
# 7 22 3
# 8 25 3
# 9 29 4
# 10 NA NA