我一直在尝试创建一个for循环,它将遍历我的数据框并为我拥有的每个ID制作相同的图。这是一些示例数据:
TJID1 <- c("TJ22", "TJ22", "TJ23", "TJ23", "TJ23", "TJ24", "TJ24")
Day <- c("2005-11-22", "2005-11-23", "2006-12-01", "2006-12-02", "2006-12-03","2005-07-08", "2005-07-08")
Mean.Depth <- c (2, 2, 3, 4, 5, 6, 6)
SE.Depth <- c(1, 1, 2, 2, 1, 2, 2)
sample <- cbind(TJID1, Day, Mean.Depth, SE.Depth)
sample <- as.data.frame(sample)
我将每个人都作为不同的TJ号码,然后对于每个TJ,他们有不同的每日深度。每个人的日子都在变化。我已经能够通过每个单独的TJ TJ22 <- sample [sample$TJID1 == "TJ22", ]
对主数据框进行子集化。然后我从图中得到的代码(使用子集化数据框):
DailyMeans_TJ22 <- ggplot(TJ22, aes(x=Day, y=Mean.Depth))+
geom_point()+
geom_line()+
geom_errorbar(aes(ymin=Mean.Depth-1.96*SE.Depth, ymax=Mean.Depth+1.96*SE.Depth), width = 0.5, col="red")
我想创建一个for循环,只循环遍历每个人并制作相同的图。这就是我到目前为止所做的:
var_list = combn(names(sample) [3:4], 3, simplify=FALSE)
plot_list = list()
for (i in unique (sample$TJID1)){
TJ <- sample[sample$TJID1== i,]
p = ggplot(TJ, aes_string(x=var_list[[i]][1], y=var_list[[i]][2])) +
geom_point()+
geom_line()
plot_list[[i]] = p
}
但字面意思只是没有给我什么。任何帮助表示赞赏!
答案 0 :(得分:1)
这是一个想法。我们可以设计一个子集sample
的函数,然后创建并返回一个图。之后,我们使用lapply
循环遍历TJID1
中的唯一值。
请注意,在原始sample
数据框中,这些数字列表示为因子。我改变了创建sample
数据框的方法来修复它。最后一点说明。 sample
是一个坏名称,因为R中有一个名为sample
的函数,会导致混淆。请使用与其他功能名称相匹配的其他名称命名您的数据框。
# Load package
library(ggplot2)
# Create example data frame
sample <- data.frame(TJID1 = c("TJ22", "TJ22", "TJ23", "TJ23", "TJ23", "TJ24", "TJ24"),
Day = c("2005-11-22", "2005-11-23", "2006-12-01", "2006-12-02", "2006-12-03","2005-07-08", "2005-07-08"),
Mean.Depth = c (2, 2, 3, 4, 5, 6, 6),
SE.Depth = c(1, 1, 2, 2, 1, 2, 2),
stringsAsFactors = FALSE)
# Design a function
gg_fun <- function(parameter, dt){
p <- ggplot(dt[dt$TJID1 == parameter, ], aes(x=Day, y=Mean.Depth))+
geom_point()+
geom_line()+
geom_errorbar(aes(ymin=Mean.Depth-1.96*SE.Depth, ymax=Mean.Depth+1.96*SE.Depth), width = 0.5, col="red") +
ggtitle(parameter)
return(p)
}
# Apply the function
plot_list <- lapply(unique(sample$TJID1), gg_fun, dt = sample)