[英]R lapply with several dynamic arguments
I'm trying to run an lapply
function using inputs from a data frame (example below).我正在尝试使用来自数据帧的输入(下面的示例)运行
lapply
function。
Here below the example of the csv file, which I called holdings.csv
:下面是 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,
Then I imported that data into a data frame with:然后我将该数据导入数据框:
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
Then I run the following code using the tq_get
function from the tidyquant
package:然后我使用来自
tq_get
package 的tidyquant
function 运行以下代码:
prices <- lapply(lots$ticker, FUN = tq_get,
from = lots$buy_date,
get = "stock.prices",
to = today())
The lapply
function gets and uses the first argument ( ticker vector) properly (going row by row in the data frame column defined), but it assumes the second argument ( buy_date vector) as an static value (not going row by row). lapply
function 正确获取并使用第一个参数( ticker vector)(在定义的数据框列中逐行进行),但它将第二个参数( buy_date向量)假定为 static 值(不是逐行)。
Basically, I want to get stock prices from different companies (first argument) using a different start date (second argument), but it looks for the stock prices for all different companies but from the same date.基本上,我想使用不同的开始日期(第二个参数)从不同的公司(第一个参数)获取股票价格,但它会查找所有不同公司的股票价格,但从同一日期开始。
Here below the output, where there are 6 lists (same as the one for the input data frame) but each list has the same number of rows (because all were gotten from the same starting date).在 output 下方,这里有 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
I've tried mapply
but it doesn't give me the result that I need.我试过
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
Your result from mapply() is because the function tries to convert the output to a matrix with the simplify argument by default.您从 mapply() 得到的结果是因为 function 尝试将 output 默认转换为带有简化参数的矩阵。 You can get your desired output with the following:
您可以通过以下方式获得所需的 output:
prices <- mapply(lots$ticker, FUN = tq_get,
from = lots$buy_date,
get = "stock.prices",
to = today(), SIMPLIFY = FALSE)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.