2016-12-09 2 views
1

Этот код займет имена 7 самых высоких столбцов в первой строке, а затем вставляет их вместе в новую переменную. Я хочу сделать это для каждой строки в наборе данных длиной 1 М, и я не могу сделать цикл за разумное время. Каков наиболее эффективный способ сделать это в R?Эффективный способ конкатенации имен 7 самых высоких столбцов в строке?

Благодаря

data(mtcars) 
mtcars$names = "" 
mtcars[1,]$names = paste(names(sort(mtcars[1,1:11]))[5:11],collapse = " ") 

ответ

1

sapply(1:nrow(mtcars), function(i) paste(names(sort(mtcars[i,1:11]))[5:11],collapse = " "))

1

Использование data.table может быть хороший подход к эффективности использования памяти.

Идея здесь состоит в том, чтобы переформатировать данные в длинный формат, отсортировать значения для каждого автомобиля, а затем выбрать 7 лучших для каждой группы.

Вы можете использование результат, как вы, в том числе paste ИНГ результаты, чтобы сделать новую переменную

library(data.table) 

dt_mtcars <- as.data.table(mtcars, keep.rownames = T) 

## melt the data into long form so we can sort it by one column 
dt_mtcars <- melt(dt_mtcars, id.vars = "rn") 

## order by group (rowname), and pick the top 7 
setorder(dt_mtcars, rn, -value) 
dt <- dt_mtcars[ dt_mtcars[, .I[c(1:7)], by = rn ]$V1 ] 

## create a new column, consisting of the names of the 'rownames' of those top 7 
dt[, paste0(variable, collapse = " "), by = rn] 

       rn        V1 
1:   AMC Javelin disp hp qsec mpg cyl wt drat 
2: Cadillac Fleetwood disp hp qsec mpg cyl wt carb 
3:   Camaro Z28 disp hp qsec mpg cyl carb wt 
4: Chrysler Imperial disp hp qsec mpg cyl wt carb 
5:   Datsun 710 disp hp mpg qsec cyl gear drat 
... etc 
3

Не уверен, насколько эффективно это с точки зрения памяти, но это достаточно быстро и все основание R :

maxnrow <- function(data, n) { 
    rowidx <- 1:nrow(data) 
    out <- vector(mode="list", n) 
    for (i in 1:n) { 
    out[[i]] <- max.col(data, "first") 
    data[ cbind(rowidx, out[[i]]) ] <- -Inf 
    } 
    do.call(paste, lapply(out, function(x) names(data)[x])) 
} 


mtcars2 <- mtcars[sample(1:nrow(mtcars),1e6,replace=TRUE),] 

system.time(maxnrow(mtcars2, 7)) 
# user system elapsed 
# 10.02 0.58 10.62