Как избежать нулевых значений в цикле FOR для обработки объектов списка в R - PullRequest
0 голосов
/ 18 сентября 2018

Я хочу получить сводную статистику, используя цикл for в пакете.

#--Zone statistics
zone <- lapply(YieldPts, function(a){extract(NewDatasetRaster[[11]], a)}) 
# extract zone variable by points

summary(YieldPts)
 Length Class                  Mode
[1,] 8489   SpatialPointsDataFrame S4  
[2,] 6300   SpatialPointsDataFrame S4  
[3,] 7484   SpatialPointsDataFrame S4  
[4,] 8583   SpatialPointsDataFrame S4  
[5,] 6761   SpatialPointsDataFrame S4  
[6,] 7244   SpatialPointsDataFrame S4 

summary(zone)
     Length Class  Mode   
[1,] 8489   -none- numeric
[2,] 6300   -none- numeric
[3,] 7484   -none- numeric
[4,] 8583   -none- numeric
[5,] 6761   -none- numeric
[6,] 7244   -none- numeric

YieldPts - большой список, содержащий фрейм данных пространственных точек.

NewDatasetRaster - это растровый стек.

Я использую lapply для извлечения данных из растрового слоя, который работает нормально.

Но когда я создаю пустой список с именем zone_stat, а затем использую цикл for для получения сводной статистики для каждого списка, он выводит нулевые значения для первых пяти списков, что меня смущает:

zone_stat <- list()
for (i in length(YieldPts)) {
zone_stat[[i]] <- aggregate(YieldPts[[i]]$yield, 
                             by=list(zone[[i]]), 
                             FUN=summary)
} 

summary(zone_stat)
     Length Class      Mode
[1,] 0      -none-     NULL
[2,] 0      -none-     NULL
[3,] 0      -none-     NULL
[4,] 0      -none-     NULL
[5,] 0      -none-     NULL
[6,] 2      data.frame list

Затем я проверил каждый список по отдельности, и он работал нормально:

zone_stat[[1]] <- aggregate(YieldPts[[1]]$yield, 
                         by=list(zone[[1]]), 
                         FUN=summary)

Скажите, пожалуйста, что я делаю неправильно, чтобы избежать этой проблемы.

1 Ответ

0 голосов
/ 18 сентября 2018

Ваш цикл for выполняется только один раз.for (i in length(YieldPts)) работает для одного значения, длина YieldPts.

Используйте for (i in 1:length(YieldPts)) или for (i in seq_along(YieldPts)).Последнее предпочтительнее и считается хорошей практикой (рассмотрим случай, когда объект имеет нулевую длину, чтобы понять почему).

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