【发布时间】:2019-11-14 08:14:38
【问题描述】:
要点:如果您要投票结束,不给出理由是不好的形式。如果无需关闭即可改进,请花 10 秒时间写一个简短的评论。
问题:
如何以内存可以支持的方式进行以下“部分融化”?
详情:
我有几百万行和大约 1000 列。列名中包含 2 条信息。
通常我会融合到由一对列组成的数据框(或表),然后我会拆分变量名称以创建两个新列,然后我会使用一个新拆分来转换新列名, 一个用于行名。
这行不通。我的十亿左右数据行使额外的列不堪重负。
在 for 循环的“迭代力”(相对于蛮力)之外,是否有一种干净有效的方法来做到这一点?
想法:
- 这有点像melt-colsplit-cast
- 常见的库似乎是“dplyr”、“tidyr”、“reshape2”和“data.table”。
- tidyr 的gather+separate+spread 看起来不错,但不喜欢没有唯一的行标识符
- reshape2 的 dcast(我正在寻找 2d 输出)想要聚合
- 蛮力丢失标签。蛮力我的意思是 df
更新(虚拟代码):
#libraries
library(stringr)
#reproducibility
set.seed(56873504)
#geometry
Ncol <- 2e3
Nrow <- 1e6
#column names
namelist <- numeric(length=Ncol)
for(i in 1:(Ncol/200)){
col_idx <- 1:200+200*(i-1)
if(i<26){
namelist[col_idx] <- paste0(intToUtf8(64+i),str_pad(string=1:200,width=3,pad="0"))
} else {
namelist[col_idx] <- paste0(intToUtf8(96+i),str_pad(string=1:200,width=3,pad="0"))
}
}
#random data
df <- as.data.frame(matrix(runif(n=Nrow*Ncol,min=0, max=16384),nrow=Nrow,ncol=Ncol))
names(df) <- namelist
我要查找的输出将有一列包含当前名称的第一个字符(单个字母字符),并且 colnames 将是 1 到 200。它比“df”宽得多,但没有完全融化.它也不会杀死我的 CPU 或内存。
(丑陋/手动)蛮力版:
(正在努力……)
【问题讨论】:
-
你试过tidyr的tidyverse解决方案吗?
-
如果没有更可重现的示例,很难提供帮助(您可以添加带有
dput的演示数据片段吗?)。但是您似乎应该能够使用lapply对每一列执行操作,这样可以节省您重塑庞大数据集的成本。 -
@jdobres - 你有虚拟数据的代码。我会检查 dput 和 lapply,但我很怀疑。块状结构让 lapply 看起来很硬。
-
@bob1 - 我卡在了展开部分。我可以收集和分离,但似乎不喜欢我没有唯一的行标识符。
-
预期输出是什么?您是否也可以编写只有 100 行且具有预期输出的代码?我不确定我的计算机生成的 2E9 数据点是否良好