R применяется с несколькими динамическими c аргументами - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь запустить функцию lapply, используя входные данные из фрейма данных (пример ниже).

Ниже приведен пример файла csv, который я назвал holdings.csv:

ticker,buy_date,shares_hold,buy_price,sell_date
"AAPL","2019-11-25",0.07,264.5714,
"MSFT","2019-11-29",0.195,151.85,
"MSFT","2020-04-08",0.6,165.17,
"DIS","2020-01-16",0.15,144.6,
"AMZN","2020-04-08",0.048,2017.5,
"BRK-B","2020-04-09",0.75,195.28,

Затем я импортировал эти данные во фрейм данных с помощью:

lots <- read_csv("holdings.csv")

> lots
# A tibble: 6 x 5
  ticker buy_date   shares_hold buy_price sell_date
  <chr>  <date>           <dbl>     <dbl> <lgl>    
1 AAPL   2019-11-25       0.07       265. NA       
2 MSFT   2019-11-29       0.195      152. NA       
3 MSFT   2020-04-08       0.6        165. NA       
4 DIS    2020-01-16       0.15       145. NA       
5 AMZN   2020-04-08       0.048     2018. NA       
6 BRK-B  2020-04-09       0.75       195. NA

Затем я запускаю следующий код, используя функцию tq_get из пакета tidyquant:

prices <- lapply(lots$ticker, FUN = tq_get, 
                          from = lots$buy_date,
                          get = "stock.prices",
                          to = today())

Функция lapply правильно получает и использует первый аргумент ( ticker vector) (построчно в определенном столбце фрейма данных), но принимает второй аргумент ( buy_date вектор) в качестве значения c (не ряд за строкой).

По сути, я хочу получить цены акций разных компаний (первый аргумент), используя другую дату начала (второй аргумент) , но он ищет цены на акции для всех разных компаний, но с одной и той же даты.

Здесь под выводом, где есть 6 списков (аналогично списку входных данных), но каждый список имеет одинаковое количество строк (потому что все были получены десять с той же даты начала).

> prices
[[1]]
# A tibble: 94 x 8
   symbol date        open  high   low close   volume adjusted
   <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>
 1 AAPL   2019-11-25  263.  266.  263.  266. 21005100     266.
 2 AAPL   2019-11-26  267.  267.  262.  264. 26301900     264.
 3 AAPL   2019-11-27  266.  268.  265.  268. 16308900     267.
 4 AAPL   2019-11-29  267.  268   266.  267. 11654400     267.
 5 AAPL   2019-12-02  267.  268.  263.  264. 23621800     264.
 6 AAPL   2019-12-03  258.  260.  256.  259. 28607600     259.
 7 AAPL   2019-12-04  261.  263.  261.  262. 16795400     261.
 8 AAPL   2019-12-05  264.  266.  263.  266. 18606100     265.
 9 AAPL   2019-12-06  267.  271   267.  271. 26518900     270.
10 AAPL   2019-12-09  270   271.  265.  267. 32010600     266.
# ... with 84 more rows

[[2]]
# A tibble: 94 x 8
   symbol date        open  high   low close   volume adjusted
   <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>
 1 MSFT   2019-11-25  150   151.  150.  151. 22420900     151.
 2 MSFT   2019-11-26  151.  152.  151.  152. 24620100     152.
 3 MSFT   2019-11-27  152.  152.  152.  152. 15184400     152.
 4 MSFT   2019-11-29  152.  152.  151.  151. 11977300     151.
 5 MSFT   2019-12-02  152.  152.  148.  150. 27418400     149.
 6 MSFT   2019-12-03  147.  149.  147.  149. 24066000     149.
 7 MSFT   2019-12-04  150.  150.  149.  150. 17574700     149.
 8 MSFT   2019-12-05  150.  150.  149.  150. 17869100     150.
 9 MSFT   2019-12-06  151.  152.  150.  152. 16403500     151.
10 MSFT   2019-12-09  151.  152.  151.  151. 16687400     151.
# ... with 84 more rows

[[3]]
# A tibble: 94 x 8
   symbol date        open  high   low close   volume adjusted
   <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>
 1 MSFT   2019-11-25  150   151.  150.  151. 22420900     151.
 2 MSFT   2019-11-26  151.  152.  151.  152. 24620100     152.
 3 MSFT   2019-11-27  152.  152.  152.  152. 15184400     152.
 4 MSFT   2019-11-29  152.  152.  151.  151. 11977300     151.
 5 MSFT   2019-12-02  152.  152.  148.  150. 27418400     149.
 6 MSFT   2019-12-03  147.  149.  147.  149. 24066000     149.
 7 MSFT   2019-12-04  150.  150.  149.  150. 17574700     149.
 8 MSFT   2019-12-05  150.  150.  149.  150. 17869100     150.
 9 MSFT   2019-12-06  151.  152.  150.  152. 16403500     151.
10 MSFT   2019-12-09  151.  152.  151.  151. 16687400     151.
# ... with 84 more rows

[[4]]
# A tibble: 94 x 8
   symbol date        open  high   low close   volume adjusted
   <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>
 1 DIS    2019-11-25  149.  150.  148.  150. 11316800     149.
 2 DIS    2019-11-26  152.  153.  151.  152. 24949900     151.
 3 DIS    2019-11-27  152.  153.  151.  151.  6155400     151.
 4 DIS    2019-11-29  151.  152.  151.  152.  6284900     151.
 5 DIS    2019-12-02  153.  153.  149.  151. 10351000     150.
 6 DIS    2019-12-03  148.  149.  147.  149.  9273800     148.
 7 DIS    2019-12-04  149.  149.  148.  148.  7684800     147.
 8 DIS    2019-12-05  149.  149.  147.  147.  7363300     147.
 9 DIS    2019-12-06  148.  149.  147.  148.  7084900     147.
10 DIS    2019-12-09  148.  149.  145.  146. 11515000     145.
# ... with 84 more rows

[[5]]
# A tibble: 94 x 8
   symbol date        open  high   low close  volume adjusted
   <chr>  <date>     <dbl> <dbl> <dbl> <dbl>   <dbl>    <dbl>
 1 AMZN   2019-11-25 1753. 1777. 1753. 1774. 3486200    1774.
 2 AMZN   2019-11-26 1780. 1797. 1778. 1797. 3181200    1797.
 3 AMZN   2019-11-27 1801  1824. 1797. 1819. 3025600    1819.
 4 AMZN   2019-11-29 1818. 1825. 1801. 1801. 1923400    1801.
 5 AMZN   2019-12-02 1804. 1806. 1763. 1782. 3925600    1782.
 6 AMZN   2019-12-03 1760  1773. 1747. 1770. 3380900    1770.
 7 AMZN   2019-12-04 1774. 1789. 1760. 1761. 2670100    1761.
 8 AMZN   2019-12-05 1764. 1764. 1740  1740. 2823800    1740.
 9 AMZN   2019-12-06 1751. 1754. 1740. 1752. 3117400    1752.
10 AMZN   2019-12-09 1751. 1767. 1746. 1750. 2442800    1750.
# ... with 84 more rows

[[6]]
# A tibble: 94 x 8
   symbol date        open  high   low close  volume adjusted
   <chr>  <date>     <dbl> <dbl> <dbl> <dbl>   <dbl>    <dbl>
 1 BRK-B  2019-11-25  219.  219.  218.  219. 3648500     219.
 2 BRK-B  2019-11-26  219.  219.  218.  219. 3717800     219.
 3 BRK-B  2019-11-27  219.  221.  218.  220. 3945500     220.
 4 BRK-B  2019-11-29  220.  221.  220.  220. 2256500     220.
 5 BRK-B  2019-12-02  221.  221.  220.  220. 3888100     220.
 6 BRK-B  2019-12-03  219.  219.  216.  218. 4480100     218.
 7 BRK-B  2019-12-04  218.  219.  218.  218. 2667700     218.
 8 BRK-B  2019-12-05  219.  220.  218.  220. 2319300     220.
 9 BRK-B  2019-12-06  222.  223   221.  223. 3447700     223.
10 BRK-B  2019-12-09  223.  223.  221.  221. 2601000     221.
# ... with 84 more rows

Я пробовал mapply, но это не дает мне результат, который мне нужен.

prices <- mapply(lots$ticker, FUN = tq_get, 
                   from = lots$buy_date,
                   get = "stock.prices",
                   to = today())

> prices
         AAPL         MSFT         MSFT        DIS          AMZN        BRK-B      
symbol   Character,94 Character,91 Character,2 Character,59 Character,2 Character,2
date     Numeric,94   Numeric,91   Numeric,2   Numeric,59   Numeric,2   Numeric,2  
open     Numeric,94   Numeric,91   Numeric,2   Numeric,59   Numeric,2   Numeric,2  
high     Numeric,94   Numeric,91   Numeric,2   Numeric,59   Numeric,2   Numeric,2  
low      Numeric,94   Numeric,91   Numeric,2   Numeric,59   Numeric,2   Numeric,2  
close    Numeric,94   Numeric,91   Numeric,2   Numeric,59   Numeric,2   Numeric,2  
volume   Numeric,94   Numeric,91   Numeric,2   Numeric,59   Numeric,2   Numeric,2  
adjusted Numeric,94   Numeric,91   Numeric,2   Numeric,59   Numeric,2   Numeric,2  

1 Ответ

1 голос
/ 12 апреля 2020

Ваш результат от mapply () состоит в том, что функция пытается преобразовать вывод в матрицу с аргументом упрощения по умолчанию. Вы можете получить желаемый результат с помощью следующего:

prices <- mapply(lots$ticker, FUN = tq_get, 
                   from = lots$buy_date,
                   get = "stock.prices",
                   to = today(), SIMPLIFY = FALSE)
...