首页 > 解决方案 > tidyverse 中带有索引参数的 by() 等价物是什么?

问题描述

我有一个带有名称列和股票代码列的数据框,股票代码列用“;”修剪 如果一个名字有超过 1 个股票代码。下面这个data.frame的一瞥:

df.info 是数据框的名称

Rows: 525
Columns: 2
$ name.company <chr> "521 PARTICIPAÇOES S.A. - EM LIQUIDAÇÃO EXTRAJUDICIAL", "524 PARTICIPAÇOES SA", "AAJR SECURITIZADORA DE CRÉDITO...
$ tickers      <chr> NA, "QVQP3B", NA, "ADHM3", "TIET11;TIET3;TIET4", "AFLT3", NA, "ALEF3B", "RPAD3;RPAD5;RPAD6", NA, "ALSO3", "ALPA...

我想要一个有 2 列、ticker 和 name.company 但没有修剪模式“;”的数据框。

e.g.: 
name   ticker
tiete  tiet11
tiete  tiet3
tiete  tiet4 

就这样……我使用 by() 函数解决了它,但我不知道如何使用 tidyverse/purrr 包解决它。

没有 tidyverse 的解决方案

get.ticker.df <- function(df.in)
{
   # Gets ticker string and organizes it in another data_frame
   temp.split <- str_split(df.in$tickers, ';')[[1]]
   temp.df <- tibble(name.company = df.in$name.company,
                         ticker = temp.split)
}
   
 my.l <- by(data = df.info,
               INDICES = df.info$name.company,
               FUN = get.ticker.df)
    
    df.tickers <- bind_rows(my.l)

我不知道 tidyverse 中这个 by() 函数的等价物。

编辑 - 添加初始帧和理想结果数据帧,以使其清晰。

tibble_start <- tibble( name.company = c("AES TIETE", "AMBEV"),
                        ticker = c("TIET11;TIET3;TIET4", "ABEV3;ABEV4"))

tibble_ideal <- tibble( name.company = c( rep("AES TIETE", 3), rep("AMBEV",2)),
                        ticker = c("TIET11","TIET3","TIET4","ABEV3","ABEV4"))

提前致谢!

标签: rfunctional-programmingtidyversedata-modeling

解决方案


我们可以用separate_rows

library(dplyr)
library(tidyr)
df1 %>%
  separate_rows(tickers)

推荐阅读