1

おはようございます。スタック オーバーフローに関する投稿は初めてです。助けてくれてありがとう!

株式データの分析に使用している 2 つのデータフレームがあります。1 つのデータ フレームには他の情報の中に日付があり、df と呼ぶことができます。

df1 <- tibble(Key = c('a','b','c'), i =11:13, date= ymd(20110101:20110103))

2 番目のデータフレームには、日付やその他の重要な情報も含まれています。

df2 <-tibble(Answer = c('a','d','e','b','f','c'), j =14:19, date= ymd(20150304:20150309))

これが私がやりたいことです: df1 の各行について、次のことを行う必要があります。

- df2$answer が df1$key と同じ場合、df1 のその行の日付に最も近い日付を df2 で見つけます。

-次に、df2 のその行の別の列の情報を抽出し、df1 の新しい行に配置します。

私が試したコード:

df1 %>%
 group_by(Key, i) %>%
 mutate(
`New Column` =  df2$j[
  which.min(subset(df2$date, df2$Answer== Key) - date)])

これにより、次の結果が得られます。

Key       i date       `New Column`
1 a        11 2011-01-01           14
2 b        12 2011-01-02           14
3 c        13 2011-01-03           14

これは、最初の行 では正しいですa。ではdf2、最も近い日付は2015-03-04で、 の値jは実際には14です。

ただし、2 番目の行 については、 のKey=bdf2の日付のみを表示するようにサブセット化しますdf2$Answer = b。したがって、日付は である必要が2015-03-07ありj =17ます。

ご協力ありがとうございました!

ジェシー

4

1 に答える 1

2

これはうまくいくはずです:

library(dplyr)
df1 %>% 
  left_join(df2, by = c("Key" = "Answer")) %>% 
  mutate(date_diff = abs(difftime(date.x, date.y, units = "secs"))) %>% 
  group_by(Key) %>% 
  arrange(date_diff) %>% 
  slice(1) %>% 
  ungroup()

まず、2 つのデータ フレームを で結合しleft_joinます。はい、それぞれに複数の日付がある可能性があることは承知していますがKey、ご容赦ください。

次に、と の 2 つの日付の差のmutate絶対値 ( ) を( で) 計算します。absdate.xdate.y

Keyこれで、 を使用してデータをグループ化しますgroup_by。これによりKey、後続の計算で個別に個別に処理されることが保証されます。

を計算したので、各 のデータをdate_diff並べ替える ( ) ことができます。最小のものを各 の先頭にします。arrangeKeydate_diffKey

date_diff最後に、最初の、それぞれの最小の のみに関心があるKeyため、 を使用して残りを破棄できslice(1)ます。

このパイプラインにより、次のことが得られます。

  Key       i date.x         j date.y     date_diff
  <chr> <int> <date>     <int> <date>     <time>   
1 a        11 2011-01-01    14 2015-03-04 131587200
2 b        12 2011-01-02    17 2015-03-07 131760000
3 c        13 2011-01-03    19 2015-03-09 131846400
于 2018-06-21T14:42:34.173 に答える