簡體   English   中英

dplyr:查找事件發生的日期

[英]dplyr: Find date for which an event occurs

第一個問題。 我是R的新手。我有以下數據框。

Source: local data frame [865,264 x 10]

   page_views       date dayofweek daytype   caseID dateDecision dateArgument dateRearg
1         169 2008-01-30 Wednesday       0 2007-001   2007-10-10   2007-10-01          
2         211 2008-01-16 Wednesday       0 2007-001   2007-10-10   2007-10-01          
3         203 2008-01-17  Thursday       0 2007-001   2007-10-10   2007-10-01          
4         177 2008-01-14    Monday       0 2007-001   2007-10-10   2007-10-01          
5         224 2008-01-15   Tuesday       0 2007-001   2007-10-10   2007-10-01          
6         152 2008-01-12  Saturday       1 2007-001   2007-10-10   2007-10-01          
7         149 2008-01-13    Sunday       1 2007-001   2007-10-10   2007-10-01          
8         220 2008-01-10  Thursday       0 2007-001   2007-10-10   2007-10-01          
9         169 2008-01-11    Friday       0 2007-001   2007-10-10   2007-10-01          
10        189 2008-01-18    Friday       0 2007-001   2007-10-10   2007-10-01          
..        ...        ...       ...     ...      ...          ...          ...       ...
Variables not shown: caseName (chr), term (int)

我想按時間順序為page_views大於零的每個caseID查找最早的日期。 我想以此日期創建一個新列。 每個caseID的結果應有一行。

我希望可以使用dplyr進行此操作,但是我願意接受其他解決方案。 使用dplyr似乎可以從group_by(caseID)和某種過濾器開始,但是我沒有運氣。

我搜索了stackoverflow和其他地方,但沒有發現任何接近的東西。

如果要創建新的摘要表:

df %>%
  filter (page_views > 0) %>%
  group_by (caseID) %>%
  summarise (earliestDate = min(date))

date變量不能成為min工作因素; 它可以是一個字符。

輸出

Source: local data frame [1 x 2]

    caseID earliestDate
1 2007-001   2008-01-10

您可以將上面代碼的最后一行替換為filter (min_rank(date) == 1)以產生相同的結果。

如果您只想對表進行重復數據刪除,則現在可以:

df %>%
  filter (page_views > 0) %>%
  group_by (caseID) %>%
  arrange (date) %>%
  slice(1) # takes the first row, which will be the earliest since the table is sorted by date

輸出

Source: local data frame [1 x 8]
Groups: caseID

  row page_views       date dayofweek daytype   caseID dateDecision dateArgument
1   8        220 2008-01-10  Thursday       0 2007-001   2007-10-10   2007-10-01

編輯:這是創建此子集的一種更為優雅的方法:

df %>% group_by(caseID) %>%
  filter(page_views > 0, date == min(date))

這是一個可能的數據data.table 可以通過同時放過濾page_views > 0Li表達,發現min(date)j表達,而通過聚集caseIDby表達

library(data.table)
setDT(df)[page_views > 0L, min(date), caseID]
#      caseID         V1
# 1: 2007-001 2008-01-10

或者,如果你希望所有的列,您才可以使用S UB d ATA( .SD )作為

setDT(df)[page_views > 0L, .SD[which.min(date)], caseID]
#      caseID page_views       date dayofweek daytype dateDecision dateArgument
# 1: 2007-001        220 2008-01-10  Thursday       0   2007-10-10   2007-10-01

使用dplyr,您幾乎可以按照描述中的說明進行操作。

x %>% group_by(caseID) %>% filter(page_views > 0) %>%
      arrange(date) %>% summarise(min_date=head(date,1))

暫無
暫無

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

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