根据组的“ DNA”为每个组分配唯一ID的更快方法

时间:2018-10-28 11:47:03

标签: r

我有一个问题,我需要根据整个组的特征对记录进行分组,但是对于我正在使用的数据集的大小,我目前的解决方案太慢了。

示例数据集:

enter image description here

A   B   C
555 A1 K500
555 B2 H650
556 A1 K600
556 B2 H700

所以我需要创建一个新列,该列将为每个组提供有关该组的更多信息,而不仅仅是A列中的信息(例如555)。

示例输出:

enter image description here

我当前的解决方案如下所示,但是对于我的数据集而言,花费的时间太长了:

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)

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

这是一个base R选项

df1$D <- do.call(paste, df1[-1]) 
merge(df1[, -4], aggregate(D ~ A, df1, FUN = paste, collapse = " "), by = "A")
#    A  B    C               D
#1 555 A1 K500 A1 K500 B2 H650
#2 555 B2 H650 A1 K500 B2 H650
#3 556 A1 K600 A1 K600 B2 H700
#4 556 B2 H700 A1 K600 B2 H700

数据

df1 <- structure(list(A = c(555L, 555L, 556L, 556L), B = c("A1", "B2", 
"A1", "B2"), C = c("K500", "H650", "K600", "H700")), .Names = c("A", 
"B", "C"), class = "data.frame", row.names = c(NA, -4L))