Вы после чего-то вроде этого:
temp_row_2011 <- apply(input_data, 1, function(x){
temp_row <- x[c("2011_01","2011_02","2011_03","2011_04","2011_05","2011_06","2011_07","2011_08","2011_09","2011_10","2011_11", "2011_12")]
temp_row[!is.na(temp_row)][1]
})
Если , то это дает вам правильный вывод, и , если , он работает быстрее, чем ваш цикл, тогдаэто не обязательно связано только с фактом использования apply()
, но также и с тем, что он назначает меньше вещей и избегает if {}
else {}
.Вы могли бы сделать это еще быстрее, скомпилировав анонимную функцию:
reduceyear <- function(x){
temp_row <- x[c("2011_01","2011_02","2011_03","2011_04","2011_05","2011_06","2011_07","2011_08","2011_09","2011_10","2011_11", "2011_12")]
temp_row[!is.na(temp_row)][1]
}
# compile, just in case it runs faster:
reduceyear_c <- compiler:::cmpfun(reduceyear)
# this ought to do the same as the above.
temp_row_2011 <- apply(input_data, 1, reduceyear_c)
Вы не сказали, является ли input_data
data.frame
или matrix
, но матрица будетбыстрее первого (но допустимо только в том случае, если input_data
относится ко всем классам данных).
[РЕДАКТИРОВАТЬ: полный пример, мотивированный DWin]
input_data <- matrix(ncol=24,nrow=10)
# years and months:
colnames(input_data) <- c(paste(2010,1:12,sep="_"),paste(2011,1:12,sep="_"))
# some ids
rownames(input_data) <- 1:10
# put in some values:
input_data[sample(1:length(input_data),200,replace=FALSE)] <- round(runif(200,100,200))
# make an all-NA case:
input_data[2,1:12] <- NA
# and here's the full deal:
sapply(2010:2011, function(x,input_data){
input_data_yr <- input_data[, grep(x, colnames(input_data) )]
apply(input_data_yr, 1, function(id){
id[!is.na(id)][1]
}
)
}, input_data)
Все NA
дело работает.grep()
идея выбора столбца снята с DWin.Как и в приведенном выше примере, вы могли бы на самом деле определить анонимную внутреннюю функцию и скомпилировать ее, чтобы потенциально ускорить работу.