【发布时间】:2019-09-10 18:53:36
【问题描述】:
我有一个 800x28000 的 data.frame。我想根据模式溢出列并绑定行。但是,我需要在此过程中创建一个名为“ticker”的新列。
这是数据框。
df1 = structure(list(AAPL.Price = c(20, 21), AAPL.Volume = c(100, 105
), MSFT.Price = c(30, 31), MSFT.Volume = c(150, 160)), class = "data.frame", row.names = c(NA,
-2L))
print(df1)
AAPL.Price AAPL.Volume MSFT.Price MSFT.Volume
1 20 100 30 150
2 21 105 31 160
我希望最终的数据框看起来像:
Price Volume Ticker
1 20 100 AAPL
2 21 105 AAPL
3 30 150 MSFT
4 31 160 MSFT
我已经建立了一个不太好的解决方法。我正在寻找的答案与 Akrun 在此处提供的答案略有不同。 Split Data Every N Columns and rbind Using R 唯一的区别是,我需要在绑定行时创建一个额外的列“Ticker”。
这是我目前的工作。
library(foreach)
library(tidyverse)
ticker = c("AAPL", "MSFT")
rbind.table = function(ticker){
header = paste0("^", ticker)
df2 = df1[str_detect(names(df1), header)]%>%mutate(ticker = ticker)
names(df2) = c("Price", "Volume", "Ticker")
return(df2)
}
df2 = foreach(r = ticker, .packages = c("tidyverse", "stringr"), .combine = "bind_rows") %dopar% {rbind.table(r)}
print(df2)
Price Volume Ticker
1 20 100 AAPL
2 21 105 AAPL
3 30 150 MSFT
4 31 160 MSFT
【问题讨论】:
-
我有 28k 列,需要 11 秒。我认为使用 data.table 可能会有更快的“最佳实践方式”。
标签: r dplyr data.table tidyverse