【问题标题】:Use List Names as Row Names When Converting From pmap to pmap_dfr purrr从 pmap 转换为 pmap_dfr purrr 时使用列表名称作为行名称
【发布时间】:2019-10-21 12:32:07
【问题描述】:

我有一个提取股票数据的 pmap 函数。当我使用 pmap() 时,我会得到一个列表,其中包含列表名称作为代码。当我使用 pmap_dfr() 时,我得到一个数据框,但行名的索引为 1:N。我希望行名成为代码。

pmap(df, ~reqMktData(tws, twsOption(local = "", symbol = ..1, expiry = ..2, strike = ..3, right = "P"), eventWrapper = eWrapper.data(1), 
                     CALLBACK = snapShot))

[[1]]
    BidSize BidPrice AskPrice AskSize Last LastSize Volume
AEM       0       -1       -1       0 0.73       14    275

[[2]]
    BidSize BidPrice AskPrice AskSize Last LastSize Volume
AEM       0       -1       -1       0 1.39        1     19

[[3]]
    BidSize BidPrice AskPrice AskSize Last LastSize Volume
BHC       0       -1       -1       0  0.7       20     26

[[4]]
    BidSize BidPrice AskPrice AskSize Last LastSize Volume
BHC       0       -1       -1       0 1.15        1      1


pmap_dfr(df, ~reqMktData(tws, twsOption(local = "", symbol = ..1, expiry = ..2, strike = ..3, right = "P"), eventWrapper = eWrapper.data(1), 
                     CALLBACK = snapShot))

 BidSize BidPrice AskPrice AskSize Last LastSize Volume
1       0       -1       -1       0 0.73       14    261
2       0       -1       -1       0 1.39        1     18
3       0       -1       -1       0 0.70       20     46
4       0       -1       -1       0 1.15        1      1

期望的输出是:

      BidSize BidPrice AskPrice AskSize Last LastSize Volume
AEM       0       -1       -1       0 0.73       14    261
AEM       0       -1       -1       0 1.39        1     18
BHC       0       -1       -1       0 0.70       20     46
BHC       0       -1       -1       0 1.15        1      1

更好的输出是:

 Ticker   BidSize BidPrice AskPrice AskSize Last LastSize Volume
1    AEM      0       -1       -1       0 0.73       14    261
2    AEM      0       -1       -1       0 1.39        1     18
3    BHC      0       -1       -1       0 0.70       20     46
4    BHC      0       -1       -1       0 1.15        1      1

谢谢。

【问题讨论】:

    标签: r functional-programming purrr


    【解决方案1】:

    您可以使用列表的rownames 添加一个新列。

    purrr::map_dfr(lst_df, ~{.x$ticker <- rownames(.x);.x})
    

    相反,如果你使用

    df1 <- do.call(rbind, lst_df)
    

    保留行名,如果需要,可以将其转换为列名

    df1$ticker <- rownames(df1)
    

    在哪里

    lst_df <- pmap(df, ~reqMktData(tws, twsOption(local = "", symbol = ..1, 
              expiry = ..2, strike = ..3, right = "P"), 
              eventWrapper = eWrapper.data(1), CALLBACK = snapShot))
    

    【讨论】:

    • Ronak 如果您不介意,我会跟进。假设我有 2 个要执行此操作的列表。我是否必须在列表 2 上再次调用 purrr::map_dfr(lst_df1, ~{.x$ticker
    • @JordanWrong 你可以这样做或将 2 个列表放在一个列表中并使用另一个 mapmap(list(lst_df1, lst_df2), ~map_dfr(.x, ~{.x$ticker &lt;- rownames(.x);.x}))
    【解决方案2】:

    你可以在原始调用中使用tibble::rownames_to_column(),然后你可以使用pmap_dfr

    library(tidyverse)
    pmap_dfr(df, ~reqMktData(
      tws, 
      twsOption(local = "", symbol = ..1, expiry = ..2, strike = ..3, right = "P"), 
      eventWrapper = eWrapper.data(1), 
      CALLBACK = snapShot) %>% 
      rownames_to_column("Ticker"))
    

    【讨论】:

      猜你喜欢
      • 2018-12-09
      • 1970-01-01
      • 2020-07-06
      • 2020-01-10
      • 1970-01-01
      • 2022-08-09
      • 1970-01-01
      • 2020-10-18
      • 2017-06-11
      相关资源
      最近更新 更多