prop.table不能在for循环中工作吗?

时间:2015-07-02 10:03:04

标签: r for-loop

这可能是一个非常简单的问题,但我不知道如何回答这个问题。 我有以下可重现的代码,其中我有两个小数据帧,我用它来计算基于每列总数的百分比值:

#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 个答案:

答案 0 :(得分: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))

答案 1 :(得分:1)

除非讨论for循环是否是最好的方法,否则你有两个问题。一,你的for循环只迭代2(长度(z))而不是1:2。二,你需要用round(....)语句做一些事情。在这个解决方案中,我添加了一个打印声明。

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