6

私は例えば日付のベクトルを持っています

dates <- c('2013-01-01', '2013-04-02', '2013-06-10', '2013-09-30')

そして、日付列を含むデータフレームなど

df <- data.frame(
                'date' = c('2013-01-04', '2013-01-22', '2013-10-01', '2013-10-10'),
                'a'    = c(1,2,3,4),
                'b'    = c('a', 'b', 'c', 'd')
                )

そして、データフレームをサブセット化して、日付が「日付」ベクトルのいずれかの日付から 5 日以内の行のみが含まれるようにしたいと思います。

つまり、初期データフレームは次のようになります

date       a b 
2013-01-04 1 a
2013-01-22 2 b
2013-10-01 3 c
2013-10-10 4 d

クエリの後、1 行目と 3 行目だけが残ります (2013-01-04 は 2013-01-01 の 5 日以内であり、2013-10-01 は 2013-09-30 の 5 日以内であるため)。

これを行う最良の方法を知っている人はいますか?

前もって感謝します

4

3 に答える 3

5

data.tableこれは、ロールを使用して簡単に (そして非常に高速に) 行うことができます。

library(data.table)
dt = data.table(df)

# convert to Date (or IDate) to have numbers instead of strings for dates
# also set the key for dates for the join
dt[, date := as.Date(date)]
dates = data.table(date = as.Date(dates), key = 'date')

# join with a roll of 5 days, throwing out dates that don't match
dates[dt, roll = 5, nomatch = 0]
#         date a b
#1: 2013-01-04 1 a
#2: 2013-10-01 3 c
于 2013-10-07T15:54:04.767 に答える
4

次のステップに分けられます。

# Rows Selected: Iterate over each row in the DF, 
#   and check if its `date` value is within 5 from any value in the `dates` vector
rows <- sapply(df$date, function(x) any( abs(x-dates) <=  5))

# Use that result to subset your data.frame
df[rows, ]

#         date a b
# 1 2013-01-04 1 a
# 3 2013-10-01 3 c

重要なのは、日付の値が実際Dateの であり、character日付のように見えるではないことを確認してください

dates <- as.Date(dates)
df$date <- as.Date(df$date)
于 2013-10-07T15:56:40.040 に答える
0

df$dateまず、それがクラスの日付であることを確認してください。それで:

df[df$date %in% sapply(dates, function(x) x:(x+5)),]

        date a b
1 2013-01-04 1 a
3 2013-10-01 3 c

何らかの理由で、これがより適切な方法である可能性があるように感じます。

 df[df$date %in% mapply(`:`, from=dates, to=dates+5),]
于 2013-10-07T15:55:34.000 に答える