r - 按列模式和绑定(bind)行拆分 data.frame R

标签 r dplyr data.table tidyverse

我有一个 800x28000 的 data.frame。我想根据模式溢出列并绑定(bind)行。但是,我需要在此过程中创建一个名为“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唯一的区别是,我需要在绑定(bind)行时创建一个额外的列“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

这是真实 data.frame 的屏幕截图。 enter image description here

最佳答案

一个 dplyrtidyr 可能是:

df1 %>%
 rowid_to_column() %>%
 gather(var, val, -rowid) %>%
 separate(var, c("Ticker", "unit")) %>%
 spread(unit, val) %>%
 select(-rowid)

  Ticker Price Volume
1   AAPL    20    100
2   AAPL    21    105
3   MSFT    30    150
4   MSFT    31    160

关于r - 按列模式和绑定(bind)行拆分 data.frame R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57876735/

相关文章:

r - 二维背包或方形包装的变体

r - dplyr 查找表/模式匹配

r - 打印 dplyr 的过滤功能过滤掉的行数

r - 使用带有 quosures 的 select

r - 使用 dplyr mutate 自动生成新的变量名

r - Dplyr 中的条件评估

r - 将字符串列拆分为年月日

R 累积不同计数客户和产品

r - 在 data.table 中组合多个变量名称列表?

r - 在 for 循环中对 data.table 进行子集化较慢且资源匮乏