[英]How to sort by year and month in R (using as.yearmon from zoo package)
[英]Grouping a data frame in R by month and year using yearmon()
編輯:
我想到了!
df_CloseDelta$YearMonth <- as.yearmon(df_CloseDelta$date)
df_CloseDelta %>%
group_by(stock, YearMonth) %>%
summarize(minCloseDelta = min(closeDelta),
meanCloseDelta = mean(closeDelta),
maxCloseDelta = max(closeDelta)) -> df_summary_CloseDelta
我創建了以下數據框,顯示日期、股票名稱以及每只股票的收盤價與前一天相比的百分比差異。
library(quantmod)
library(dplyr)
library(tidyr)
library(ggplot2)
library(zoo)
start <- as.Date("2014-01-01")
end <- as.Date("2017-12-31")
getSymbols(c("AAPL", "AMZN", "FB", "GOOG", "MSFT"),
from = start, to = end, return.class = "data.frame")
df_wide <- bind_cols(AAPL, AMZN, FB, GOOG, MSFT) %>%
mutate(date = as.Date(rownames(AAPL)))
df_long <- df_wide %>%
gather(key = stock, value = value, - date) %>%
separate(stock, into = c("stock", "type"))
df_panel <- df_long %>%
spread(key = type, value = value)
df_CloseDelta <- df_panel %>%
group_by(stock) %>%
mutate(closeDelta = 100 * (Close - lag(Close))/lag(Close)) %>%
select(date, stock, closeDelta) %>%
filter(!is.na(closeDelta))
我正在嘗試按年份和月份對這些條目進行分組(2014 年 1 月 AAPL 收盤價的所有百分比變化,2014 年 1 月 AMZN 收盤價的所有百分比變化等)我正在嘗試使用yearmon() 函數來執行此操作,並認為我可以創建(變異)一個新列,我可以在其中提取年份和月份,然后對數據進行分組,或者只是將其分組而不創建新列。 我能夠做到這一點:
as.yearmon(df_CloseDelta$date)
並返回:
[1] "Jan 2014" "Jan 2014" "Jan 2014" "Jan 2014" "Jan 2014" "Jan 2014" "Jan 2014"
[8] "Jan 2014" "Jan 2014" "Jan 2014" "Jan 2014" "Jan 2014" "Jan 2014" "Jan 2014"
[15] "Jan 2014" "Jan 2014" "Jan 2014" "Jan 2014" "Jan 2014" "Jan 2014" "Jan 2014"
[22] "Jan 2014" "Jan 2014" "Jan 2014" "Jan 2014" "Jan 2014" "Jan 2014" "Jan 2014"
對每個條目依此類推。
然后我嘗試將其分組:
df_summary_CloseDelta <- df_CloseDelta %>%
group_by(as.yearmon(df_CloseDelta$date))
但收到此錯誤:
Error in mutate_impl(.data, dots) :
Column `as.yearmon(df_CloseDelta$date)` must be length 1006 (the group
size) or one, not 5030
我知道有 1,006 個日期,但鑒於有 5 只股票,因此有 5,030 個條目。 我試圖將它們分組,然后找出每個股票的每月和每年的平均值、最小值和最大值。 有人可以指出我正確的方向嗎?
group_by
期望您為其提供變量名稱或長度與數據中的行數相同的向量,這些向量將被視為執行分組的因素。 請參閱下面的示例。
> btest <- data.frame(a = LETTERS[1:10],
+ b = c(1,1,2,2,3,3,4,4,5,5),
+ c = c(rep('e',5), rep('f',5)))
> btest
a b c
1 A 1 e
2 B 1 e
3 C 2 e
4 D 2 e
5 E 3 e
6 F 3 f
7 G 4 f
8 H 4 f
9 I 5 f
10 J 5 f
現在我們可以通過兩種方式之一計算我們感興趣的組的總和。 傳統的方法是使用group_by
然后我們的變量c
。
> btest %>%
+ group_by(c) %>%
+ summarise(ex = mean(b))
# A tibble: 2 x 2
c ex
<fct> <dbl>
1 e 1.80
2 f 4.20
但是,您的代碼認為您要做的是提供將用於形成分組的逐行值。
> btest %>%
+ group_by(c(1,1,1,1,1,2,2,2,2,2)) %>%
+ summarise(ex = mean(b))
# A tibble: 2 x 2
`c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2)` ex
<dbl> <dbl>
1 1.00 1.80
2 2.00 4.20
只是為了讓我們清楚手段應該是什么。
> mean(c(1,1,2,2,3))
[1] 1.8
> mean(c(3,4,4,5,5))
[1] 4.2
您的問題是您需要先添加要分組的列,然后才能對其進行分組。
> df_CloseDelta[['date_yearmon']] <- as.yearmon(df_CloseDelta[['date']])
>
> df_CloseDelta %>%
+ group_by(date_yearmon, stock) %>%
+ summarise(mean_closedelta = mean(closeDelta))
# A tibble: 240 x 3
# Groups: date_yearmon [?]
date_yearmon stock mean_closedelta
<S3: yearmon> <chr> <dbl>
1 Jan 2014 AAPL -0.474
2 Jan 2014 AMZN -0.472
3 Jan 2014 FB 0.746
4 Jan 2014 GOOG 0.310
5 Jan 2014 MSFT 0.104
6 Feb 2014 AAPL 0.269
7 Feb 2014 AMZN 0.0631
8 Feb 2014 FB 0.491
9 Feb 2014 GOOG 0.159
10 Feb 2014 MSFT 0.0713
# ... with 230 more rows
或者,如果您想在dplyr
完成整個dplyr
,您可以執行以下操作。
df_CloseDelta %>%
mutate(date_yearmon = as.character(as.yearmon(date))) %>%
group_by(date_yearmon, stock) %>%
summarise(mean_closedelta = mean(closeDelta))
xts 必須to.monthly
直接轉換為每月,因此假設輸入 OHLCV 數據位於環境e
中的一組 xts 對象中,最后我們對e
每個此類對象應用轉換函數(將兩者轉換為每月,到數據框並附加符號),然后將結果數據框綁定到單個數據。
sym2df <- function(x, env) cbind(Symbol = x, fortify.zoo(to.monthly(env[[x]], name = "")))
do.call("rbind", lapply(ls(e), sym2df, env = e))
將股票數據放入環境e
:
library(quantmod)
start <- "2014-01-01"
end <- "2017-12-31"
syms <- c("AAPL", "AMZN", "FB", "GOOG", "MSFT")
getSymbols(syms, from = start, to = end, env = e <- new.env())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.