Я пытаюсь настроить функцию, имеющуюся в R. Функция (с моими изменениями) выглядит следующим образом:
(благодаря Akrun здесь )
library(purrr)
library(dplyr)
fs <- list(as_mapper(~ top_n(20)),
as_mapper(~ row_number() %in% sample(row_number(), 20 )),
as_mapper(~ top_n(-20)
)
map2_df(list(1, c(2, 3), 4), fs, ~
data %>%
filter(totals > 100, score_rank %in% .x) %>%
filter(.y(score))
)%>% bind_rows(data %>%
filter(totals <= 100))
Я пытаюсь изменить исходную функцию следующим образом:
Если score_rank
= 1, взять 20 нижних наблюдений (на основе столбца score
)
Если score_rank
= 2 или 3, то взять случайную выборку наблюдений каждой группы
Если score_rank
= 4, тогда взять 20 лучших наблюдений (на основе столбца score
)
Итак, я хочу изменить часть кода fs
, просто добавление top_n()
не работает.
Данные:
tickers <- c("GIS", "KR", "MKC", "SJM", "EL", "HRL", "HSY", "K",
"KMB", "MDLZ", "MNST", "PEP", "PG", "PM", "SYY", "TAP", "TSN", "WBA", "WMT",
"MMM", "ABMD", "ACN", "AMD", "AES", "AON", "ANTM", "APA", "CSCO", "CMS", "KO", "GRMN", "GPS",
"JEC", "SJM", "JPM", "JNPR", "KSU", "KEYS", "KIM", "NBL", "NEM", "NWL", "NFLX", "NEE", "NOC", "TMO", "TXN", "TWTR")
library(tidyquant)
data <- tq_get(tickers,
get = "stock.prices", # Collect the stock price data from 2010 - 2015
from = "2010-01-01",
to = "2015-01-01") %>%
group_by(symbol) %>%
tq_transmute(select = adjusted, # Convert the data from daily prices to monthly prices
mutate_fun = periodReturn,
period = "monthly",
type = "arithmetic")
data$score <- runif(nrow(data), min = 0, max = 1)
data$totals <- runif(nrow(data), min = 10, max = 150)
data <- data %>%
group_by(date) %>%
mutate(
score_rank = ntile(score, 4)
)