В настоящее время я работаю с серией больших наборов данных и пытаюсь улучшить способ написания сценариев на языке R. Я обычно использую циклы for, которые, как я знаю, могут быть громоздкими и медленными, особенно с очень большими наборами данных..
Я слышал, что многие люди рекомендуют семейство apply () избегать сложных циклов for, но я стараюсь, чтобы они умудрились использовать их для применения нескольких функций за один раз.
Вот некоторые простые примеры данных:
A <- data.frame('Area' = c(4, 6, 5),
'flow' = c(1, 1, 1))
B <- data.frame('Area' = c(6, 8, 4),
'flow' = c(1, 2, 1))
files <- list(A, B)
frames <- list('A', 'B')
Я хочу отсортировать данные по переменной «поток», а затем добавить столбцы для части общего «потока» и «площади» каждого из данных.точка представляет, прежде чем, наконец, добавить еще два столбца совокупного процента каждой переменной.
В настоящее время я использую это для цикла:
sort_files <- list()
n <- 1
for(i in files){
name <- frames[n]
nom <- paste(name,'_sorted', sep = '')
data <- i[order(-i$flow),]
area <- sum(i$Area)
total <- sum(i$flow)
data$area_portion <- (data$Area/area)*100
data$flow_portion <- (data$flow/total)*100
data$cum_area <- cumsum(data$area_portion)
data$cum_flow <- cumsum(data$flow_portion)
assign(nom, data)
df <- get(paste(name,'_sorted', sep = ''))
sort_files[[nom]] <- df
n <- n + 1
}
, который работает, но кажется слишком сложным и уродливым,и я уверен, что он будет работать намного медленнее, чем лучшие сценарии.
Как я могу упростить и улучшить приведенный выше код?
Это ожидаемый результат:
sort_files
$`A_sorted`
Area flow area_portion flow_portion cum_area cum_flow
1 4 1 26.66667 33.33333 26.66667 33.33333
2 6 1 40.00000 33.33333 66.66667 66.66667
3 5 1 33.33333 33.33333 100.00000 100.00000
$B_sorted
Area flow area_portion flow_portion cum_area cum_flow
2 8 2 44.44444 50 44.44444 50
1 6 1 33.33333 25 77.77778 75
3 4 1 22.22222 25 100.00000 100