2015-07-02 2 views
2

Это может быть очень простой вопрос, но я не вижу, как ответить на него. У меня есть следующий код воспроизводимого, где у меня есть два маленьких dataframes, которые я использую, чтобы вычислить процентное значение, основанное на каждой общую колонку:prop.table не работает в петле?

#dataframe x 
x <- structure(list(PROV = structure(c(1L, 1L), .Label = "AG", class = "factor"), 
        APT = structure(1:2, .Label = c("AAA", "BBB"), class = "factor"), 
        PAX.2013 = c(5L, 4L), PAX.2014 = c(4L, 2L), PAX.2015 = c(4L,0L)), 
       .Names = c("PROV", "APT", "PAX.2013", "PAX.2014", "PAX.2015"), 
       row.names = 1:2, class = "data.frame") 

#dataframe y 
y <- structure(list(PROV = structure(c(1L, 1L), .Label = "AQ", class = "factor"), 
        APT = structure(1:2, .Label = c("CCC", "AAA"), class = "factor"), 
        PAX.2013 = c(3L, 7L), PAX.2014 = c(2L, 1L), PAX.2015 = c(0L,3L)), 
       .Names = c("PROV", "APT", "PAX.2013", "PAX.2014", "PAX.2015"), 
       row.names = 1:2, class = "data.frame") 

#list z (with x and y) 
z <- list(x,y) 

#percentage value of x and y based on columns total 
round(prop.table(as.matrix(z[[1]][3:5]), margin = 2)*100,1) 
round(prop.table(as.matrix(z[[2]][3:5]), margin = 2)*100,1) 

, как вы можете видеть, она работает просто отлично. Теперь я хочу автоматизировать весь список, но я не могу понять, как получить результаты. Это мой простой код:

#for-loop that is not working 
for (i in length(z)) 
{round(prop.table(as.matrix(z[[i]][3:5]), margin = 2)*100,1)} 
+2

попробовать 'для (я в 1: длина (г))' вместо ' для (i по длине (z)) '. И явно 'print (round (...))' в вашем цикле – scoa

+0

Я знал, что это разоблачит мое отвлечение ... Я не видел, что я использовал длину вместо seq_along! Печать на самом деле не нужна, я буду использовать эту таблицу другими способами, чтобы я не хотел, чтобы вы много волновались! Thx – MaZe

ответ

3

У вас есть две проблемы.

Во-первых, вы не поместили диапазон в цикл for, так что вы просто пытаетесь выполнить итерацию по одному числу, а во-вторых, вы не назначаете свой результат нигде на каждой итерации.

Используйте 1:length(z), чтобы определить диапазон. Затем присвойте результаты переменной.

Это будет работать:

my_list <- list() 
for (i in 1:length(z)){ 
    my_list[[i]] <- round(prop.table(as.matrix(z[[i]][3:5]), 
            margin = 2)*100,1) 
} 
my_list 

Но было бы более эффективным и идиоматических использовать lapply:

lapply(1:length(z), 
    function(x) round(prop.table(as.matrix(z[[x]][3:5]), margin = 2)*100,1)) 
+0

Спасибо. Я тоже старался, но, конечно, у меня была такая же проблема с длиной! – MaZe

1

Запрет обсуждения вопроса о том, подходит ли метод for-loops, у вас было две проблемы. Один, ваш цикл for выполняет только итерацию более 2 (которая является длиной (z)) вместо 1: 2. Два, вам нужно что-то сделать с помощью круглого (....) утверждения. В этом решении я добавил заявление печати.

for (i in 1:length(z)){ 
    print(round(prop.table(as.matrix(z[[i]][3:5]), margin = 2)*100,1)) 
} 
+0

Спасибо. Как уже отмечалось выше, я был уверен, что это глупая проблема, и действительно! – MaZe

Смежные вопросы