Более быстрый способ присвоить уникальный идентификатор каждой группе на основе «ДНК» группы - PullRequest
0 голосов
/ 28 октября 2018

У меня проблема с тем, что мне нужно сгруппировать записи на основе характеристик группы в целом, но мое текущее решение сделать это слишком медленно для размера наборов данных, с которыми я работаю.

Пример набора данных:

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 голосов
/ 28 октября 2018

Вот вариант 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

data

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))
0 голосов
/ 28 октября 2018

В 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]

Редактировать: я перезапустил вам пример и увидел, что вы создаете столбецДНК, которая имеет немного другую структуру.

Если вы хотите получить такой столбец, вы просто замените внутреннюю часть в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...