我正在尝试在读取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行绘制一张雷达图?
谢谢!
答案 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)