r - 根据组的“DNA”更快地为每个组分配唯一 ID
问题描述
我有一个问题,我需要根据整个组的特征对记录进行分组,但是我目前的解决方案对于我正在使用的数据集的大小来说太慢了。
示例数据集:
A B C
555 A1 K500
555 B2 H650
556 A1 K600
556 B2 H700
因此,我需要创建一个新列,为每个组提供有关该组的更多信息,而不仅仅是 A 列中的信息(例如 555)。
示例输出:
我当前的解决方案如下所示,但对于我的数据集的大小来说需要很长时间:
DNA <- function(x) {
Subset = filter(
df,
A==x)
Subset$Concat = paste(Subset$B,Subset$C,sep="")
toString(Subset$Concat)
}
df$DNA= mapply(DNA, df$A)
解决方案
在dplyr
中,类似:
library(dplyr)
df %>%
group_by(A) %>%
mutate(
D = paste(paste(B, C, sep = " "), collapse = " ")
)
在data.table
:
library(data.table)
setDT(df)[, D := paste(paste(B, C, sep = " "), collapse = " "), by = A]
编辑:我重新运行了您的示例,并看到您生成的 DNA 柱的结构略有不同。
如果你想得到这样一个列,你只需用 和 替换里面dplyr
的DNA = paste(paste0(B, C), collapse = ", ")
内部DNA := paste(paste0(B, C), collapse = ", ")
部分data.table
。
microbenchmark
由于您说您对速度感兴趣(单位为毫秒),因此我也将其运行了一遍:
DNA function
: 4.013901
dplyr
: 1.664197
data.table
: 0.7746959
推荐阅读
- c# - 带有绑定的 MVVM 菜单栏
- salesforce - 将值传递给 LWC 中的闪电输入标签
- javafx - JavaFX 在 VBox-es 的网格窗格中创建单选按钮行为
- java - 通过 jsoup 提取 html 文本作为任务和答案
- php - 在 AWS Elastic Beanstalk 上部署 Laravel 应用程序(使用 Scheduler)并运行计划
- javascript - 与 nodejs worker_threads 模块一起使用时出现广播频道问题
- tabulator - 链接标签中的 HTML
- azure-application-insights - Azure Insights 遥测未在所有事务中显示 Auth ID
- python - Odoo 不会用新值更新存储的值,它会用前一个值更新
- python - 如何制作相关矩阵