我有一个问题,我需要根据整个组的特征对记录进行分组,但是对于我正在使用的数据集的大小,我目前的解决方案太慢了。
示例数据集:
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)
答案 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))