从pmap转换为pmap_dfr时,将列表名称用作行名称

时间:2019-06-06 01:38:30

标签: r functional-programming purrr

我有一个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

谢谢。

2 个答案:

答案 0 :(得分:2)

您可以在列表的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))

答案 1 :(得分:0)

您可以在原始通话中使用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"))