Классификация данных 1Д


Это R код разделяет ценности в rData. Они классифицируются согласно классу в rClass.

Для этого ClassifiedrData это именованный список, где каждый элемент в списке (класса), должен быть вектор, содержащий все элементы этого класса.

Он идет медленно, и я читал, что я должен не использовать for в R, но я не имею понятия о том, как векторизовать его.

(Я не обязательно нужен словарь, так что я приветствую другую структуру данных для хранения секретной цифры, если это более практично.)

Я сделал случайные данные (rData и rClass) в качестве примера, но мои реальные данные не случайный (так что я просто создать данные группировки не является решением)

CreateEmptyDictionary <- function(names) {
    mylist.names <- names
    mylist <- vector("list", length(mylist.names))
    names(mylist) <- mylist.names
    return(mylist)
}


#Random integers
rData <- sample(x = as.integer(c(1:100)), size = 100)

#Random class  
rClass <- sample(x = c(1:10), size = 100, replace = TRUE)

#Separate rData according to his class in rClass
i <- 0
ClassifiedrData <- CreateEmptyDictionary(names <- sort(unique(rClass)))

for (a in rData) {
    i <- i + 1
    #ClassifiedrData[[rClass[i]]] <-  append(ClassifiedrData[[rClass[i]]], a)
    ClassifiedrData[[rClass[i]]][length(ClassifiedrData[[rClass[i]]])+1] <- a
}


111
0
задан 10 апреля 2018 в 03:04 Источник Поделиться
Комментарии
1 ответ

Это на самом деле 1-вкладыш со встроенной split функции:

ClassifiedrDataSplit <- split(rData, rClass)

Вы можете подтвердить это возвращает тот же самый результат, как ваш оригинальный код:

identical(ClassifiedrData, ClassifiedrDataSplit)
# [1] TRUE

Помимо того, что это намного меньше кода, это приведет к разумным ускорений для больших наборов данных. Например, рассмотрим работу с 10 млн. элементов и 10 классов:

rData <- sample(x = as.integer(c(1:1e7)), size = 1e7)
rClass <- sample(x = c(1:10), size = 1e7, replace = TRUE)
system.time({i <- 0
ClassifiedrData <- CreateEmptyDictionary(names <- sort(unique(rClass)))

for (a in rData) {
i <- i + 1
#ClassifiedrData[[rClass[i]]] <- append(ClassifiedrData[[rClass[i]]], a)
ClassifiedrData[[rClass[i]]][length(ClassifiedrData[[rClass[i]]])+1] <- a
}})
# user system elapsed
# 5.248 0.435 5.749
system.time(split(rData, rClass))
# user system elapsed
# 0.258 0.083 0.357

Решение с split примерно в 10 раз быстрее.

1
ответ дан 10 апреля 2018 в 03:04 Источник Поделиться