簡體   English   中英

通過基於列的計算在R中過濾數據幀

[英]Filtering data frame in R by calculations based on a column

我有一個包含多個列的數據框,其中兩個是日期。 我想從一個日期列中計算從該日期(日期-14)到今天的所有星期日。 然后,我想在其他日期列等於這些日期的地方過濾我的數據。 下面是一個示例:(原始數據遠大於此數據)

ex_data <- data.frame(
  c("2018-05-27", "2018-06-24", "2018-07-01", "2018-07-08", "2018-06-25",
    "2018-07-05", "2018-07-10", "2018-05-30", "2018-06-20", "2018-07-04", 
    "2017-12-05"),   
  c("2018-05-13", "2018-02-04", "2018-06-17", "2018-06-10", "2018-04-04", 
    "2018-01-14", "2018-06-17", "2018-06-24", "2018-07-01", "2017-12-03",
    "2018-06-17"), 
  c(rep("1", 4), rep("2", 3), rep("3", 2), rep("1", 1),5),   
  c(rep("xxx", 4), rep("yyyy", 3), rep("zz", 2), rep("xxx", 1),"ttt"))


colnames(ex_data) <- c("Date1", "Date2", "Ex1", "Ex2")

我想找到從Date1到今天兩周的星期日(我們稱其為“ previousSundays”)。 每行的結果是從date1的對應值到今天的星期日的列表/向量。 例如,對於第一行,它將是:

"2018-05-13" "2018-05-20" "2018-05-27" "2018-06-03" "2018-06-10"
"2018-06-17" "2018-06-24" "2018-07-01" "2018-07-08" "2018-07-15" 
"2018-07-22" "2018-07-29"

然后,我想過濾數據框,以便僅具有Date2等於“ previousSundays”的值。

所需的輸出如下所示:(僅對前三行進行了一次計算)

   Date1           Date2       Ex1  Ex2            
   2018-05-27   2018-05-13       1  xxx
   2018-07-01   2018-06-17       1  xxx

有什么想法在R中做到這一點的最佳方法是什么? 我使用了lapplyseq函數,但是沒有用。 以下是我嘗試執行的操作:

ex_data$prevdays <- lapply(ex_data$Date1 - 14, seq, var2 = Sys.Date(), by = "week")

(以及上面一行的一些變體)

我已經搜索過網站/互聯網,但是找不到解決我的問題的解決方案。 感謝我的任何建議,因為我找不到解決該問題的優雅方法。

您似乎可以通過設置一系列條件來做到這一點。

# first recode the dates
ex_data[, 1:2] <- lapply(ex_data[, 1:2], as.Date)

# check if date is a sunday    
is.sunday <- format(ex_data$Date2, "%u") == 7

today <- Sys.Date()

# slightly more tricky. Aggregate Date1 over Ex2 and find the minima
mins <- aggregate(Date1 ~ Ex2, data=ex_data, min)

# use the result as a lookup-table
mins <- mins$Date1[match(ex_data$Ex2, mins$Ex2)]

# combine (create the intersect of) the conditions
matches <- ex_data$Date2 > mins - 14 & ex_data$Date2 < today & is.sunday

# and filter the data
ex_data[matches,]

#         Date1      Date2 Ex1  Ex2
# 3  2018-07-01 2018-06-17   1  xxx
# 4  2018-07-08 2018-06-10   1  xxx
# 7  2018-07-10 2018-06-17   2 yyyy
# 8  2018-05-30 2018-06-24   3   zz
# 9  2018-06-20 2018-07-01   3   zz
# 11 2017-12-05 2018-06-17   5  ttt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM