簡體   English   中英

當某些日期為 NA 時,按日期合並 R 中的兩個數據框

[英]Merging two dataframes in R by date when some dates are NA

我有兩個數據框;

df.tweets <- data.frame(Date = c(as.Date("2020-12-26"), as.Date="2020-12-15", as.Date="2021-01-12"), Tweet = c("abs", "ksk", "sks"), Ticker = c("NFLX", "GOOGL", "FB"))

           Date Tweet Ticker
1 2020-12-26   abs   NFLX
2 2020-12-15   ksk  GOOGL
3 2021-01-12   sks     FB

df.finance <- data.frame(Date = c(as.Date("2020-12-25"), as.Date="2020-12-27", as.Date="2020-12-15", as.Date="2021-01-12"), AR = c("0.23", "0.34", "0.44", "0.91"), Ticker = c("NFLX", "NFLX", "GOOGL", "FB"))

        Date   AR Ticker
1 2020-12-25 0.23   NFLX
2 2020-12-27 0.34   NFLX
3 2020-12-15 0.44  GOOGL
4 2021-01-12 0.91     FB

我想將這兩個數據框合並成這樣的東西;

df.output <- data.frame(Date = c(as.Date("2020-12-27"), as.Date="2020-12-15", as.Date="2021-01-12"), Tweet = c("abs", "ksk", "sks"), Ticker = c("NFLX", "GOOGL", "FB"), AR = c("0.34", "0.44", "0.91"))

        Date Tweet Ticker   AR
1 2020-12-27   abs   NFLX 0.34
2 2020-12-15   ksk  GOOGL 0.44
3 2021-01-12   sks     FB 0.91

最初使用此代碼;

df.new_analysis <- merge(df.new, df.finance, by = c("Date", "Ticker"), all.x = TRUE)

但是,由於某些推文是在周末發布的,因此沒有與日期相對應的股票數據。 我找到了周六和周日的推文,並將日期更改為下周一(合並數據框之前)以查找下一個交易日。

df.tweets$weekday <- weekdays(df.tweets$Date)
df.tweets$Date <- as.Date(df.tweets$Date)

for (row in 1:nrow(df.tweets)){
  if (df.tweets[row, 4] == "Saturday") {                # 4 = Weekday column
    df.tweets[row, 1] <- df.tweets[row, 1] + 2          # 1 = Date column
  }
  else if (df.tweets[row, 4] == "Sunday"){
    df.tweets[row, 1] <- df.tweets[row, 1] + 1
  }
}

但是,現在我遇到的問題是,有些交易日期是工作日(不是周末),但由於公共假期(例如復活節星期一),證券交易所休市。

有沒有比在日列中添加天數直到沒有 NA 更簡單的方法來解決這個問題? 例如,如果沒有相應的日期,則合並數據框以在 df.finance 中查找第二天。

我並不關心數據列是推文日期還是AR(異常返回),只要AR來自下一個交易日而不是前一個交易日。

使用dplyr一種方法:

library(dplyr)

df.tweets %>%
  #Join the two dataframes
  full_join(df.finance, by = 'Ticker') %>%
  #Arrange the data by date
  arrange(Ticker, Date.x) %>%
  #Get the difference between the dates
  mutate(diff = Date.y - Date.x) %>%
  #For each ticker and date
  group_by(Ticker, Date.x) %>%
  #Select the first row where the 
  #difference is greater than equal to 0
  slice(which.max(diff >= 0)) %>%
  ungroup %>%
  #Select and rename columns.
  select(Date = Date.y, everything(), -diff, -Date.x)

#   Date       Tweet Ticker AR   
#  <date>     <chr> <chr>  <chr>
#1 2021-01-12 sks   FB     0.91 
#2 2020-12-15 ksk   GOOGL  0.44 
#3 2020-12-27 abs   NFLX   0.34 

暫無
暫無

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

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