R lapply 有几个动态参数
Posted
技术标签:
【中文标题】R lapply 有几个动态参数【英文标题】:R lapply with several dynamic arguments 【发布时间】:2020-04-12 17:18:39 【问题描述】:我正在尝试使用来自数据框的输入来运行 lapply
函数(示例如下)。
下面是我称之为holdings.csv
的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
然后我使用tidyquant
package 中的tq_get
函数运行以下代码:
prices <- lapply(lots$ticker, FUN = tq_get,
from = lots$buy_date,
get = "stock.prices",
to = today())
lapply
函数正确获取并使用第一个参数(ticker 向量)(在定义的数据框列中逐行进行),但它假定第二个参数(buy_date 向量)作为静态值(不是逐行)。
基本上,我想使用不同的开始日期(第二个参数)从不同的公司(第一个参数)获取股票价格,但它会查找所有不同公司的股票价格,但从同一日期开始。
在输出下方,有 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
【问题讨论】:
请不要发布数据的屏幕截图。如果您的问题包含minimal reproducible example,包括一小部分数据,您将获得更高质量的帮助。 对于mapply
,它不起作用是什么意思?错误?不想要的结果?请显示尝试的实施。
我已经从包pbapply
中尝试了lapply
的版本。我将使用mapply
结果更新问题
【参考方案1】:
您的 mapply() 结果是因为该函数尝试将输出转换为默认情况下使用简化参数的矩阵。您可以通过以下方式获得所需的输出:
prices <- mapply(lots$ticker, FUN = tq_get,
from = lots$buy_date,
get = "stock.prices",
to = today(), SIMPLIFY = FALSE)
【讨论】:
以上是关于R lapply 有几个动态参数的主要内容,如果未能解决你的问题,请参考以下文章
linux下,有几个.so。如何将这几个动态库编译成一个动态库