在创建雷达图时,在R中进行循环

时间:2013-06-18 01:37:49

标签: r

我正在尝试在读取CSV文件中的数据时绘制雷达图。这些数据的排列方式是在每5行从特定列读取数据后绘制雷达图。

我有基于读入特定列的(例如,在下面的示例中,前5行)绘制雷达图的代码。如何自动化(创建一个for循环),以便每读入5行数据,就会绘制雷达图?

我目前的代码是这样的:

require(fmsb)
range <- c(0, 2)
id5 <- c(exceldata$excelcolumn[1:5])
id5.df <- data.frame(rbind(max=range[2], min=range[1], id5)
radarchart(id5.df ...)

[1:5]是我在绘制雷达图之前要读取的前5行的手动规范。如何将其更改为for-loop以每5行绘制一张雷达图?

谢谢!

1 个答案:

答案 0 :(得分:0)

执行此操作的一种经典方法是使用聪明的索引拆分data.frame的行的seq。这应该适合您:

ll <- split(seq(nrow(exceldata)),cumsum(seq(nrow(exceldata))%%5==1))
lapply(ll,function(x){
        id5 <- c(exceldata$excelcolumn[x])
        id5.df <- data.frame(rbind(max=range[2], min=range[1], id5)
        radarchart(id5.df,...)
}

例如,在可重现的示例上进行测试。我创建了一个20行的data.frame,每5行创建一个雷达图。

set.seed(123)
N <- 20
dat <- data.frame(
  total=runif(N, 1, 5),
  phys=rnorm(N, 10, 2),
  psycho=sample(c(0.5, NA, 3),N,rep=TRUE),
  social=runif(N, 1, 5),
  env=sample(c(5, 2.5, 4),N,rep=TRUE))

ll <- split(seq(nrow(dat)),cumsum(seq(nrow(dat))%%5==1))
op <- par(mar=c(1, 2, 2, 1),mfrow=c(2, 2))

lapply(ll,
       function(x)radarchart(dat[x,]))
par(op)

enter image description here