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