首页 > 解决方案 > R中自定义子集数据的多重绘图

问题描述

对于以下数据集,我可以为每个 ID 创建图。有六个 ID,每个重复 4 次。

data=data.frame(ID=rep(1:6,each=4), y.value=c(1:24), x.value=seq(0,11.5, by=0.5))

setwd("C:/Users/mnudd/Desktop")
pdf(file = "myplot.pdf")
for( id.no in 1:6){
  plot(data$y.value[data$ID==id.no]~data$x.value[data$ID== id.no],xlim=c(0,12),ylim=c(0,25),type="l",col="black",
       xlab="time", ylab= "",main = paste("ID number", id.no), data=data)
  points(data$y.value[data$ID==id.no]~data$x.value[data$ID==id.no])
}
dev.off()

现在我想为以下子集 data1 创建相同的图,

data1=data[data$ID  %in% c(1,3,4),]
setwd("C:/Users/mnudd/Desktop")
pdf(file = "myplot1.pdf")
for( id.no in 1:length(unique(data1$ID))){
  plot(data1$y.value[data1$ID==id.no]~data1$x.value[data1$ID== id.no],xlim=c(0,12),ylim=c(0,25),type="l",col="black",
       xlab="time", ylab= "",main = paste("ID number", id.no), data=data)
  points(data1$y.value[data1$ID==id.no]~data1$x.value[data1$ID==id.no])
}
dev.off()

从上面的代码中,我期望 pdf 文件中有三个图,每个图标题应该对应于第一个图标题应该是 ID 号 1、ID 号 3 和 ID 号 4 的 ID 号。

不幸的是,子集数据的循环不起作用。如果子集很大,是否有任何通用循环或函数?
感谢您的帮助。

标签: rplotsubset

解决方案


考虑by(面向对象的包装器tapply),它本质上是应用系列版本,用于循环遍历unique列中值的数据集:

# FULL DATA
output <- by(data, data$ID, function(sub) {
  plot(sub$y.value ~ sub$x.value, xlim=c(0,12), ylim=c(0,25), type="l", col="black",
       xlab="time", ylab= "", main = paste("ID number", sub$ID[[1]]))
  points(sub$y.value ~ sub$x.value)
})

# SUBSET DATA
data1 <- data[data$ID  %in% c(1,3,4),]

output <- by(data1, data1$ID, function(sub) {
  plot(sub$y.value ~ sub$x.value, xlim=c(0,12), ylim=c(0,25), type="l", col="black",
       xlab="time", ylab= "", main = paste("ID number", sub$ID[[1]]))
  points(sub$y.value ~ sub$x.value)
})

有一个功能:

proc_plot <- function(sub) {
  plot(sub$y.value ~ sub$x.value, xlim=c(0,12), ylim=c(0,25), type="l", col="black",
           xlab="time", ylab= "", main = paste("ID number", sub$ID[[1]]))
  points(sub$y.value ~ sub$x.value)
}

# FULL DATA
output <- by(data, data$ID, proc_plot)

# SUBSET DATA
data1 <- data[data$ID  %in% c(1,3,4),]
output <- by(data1, data1$ID, proc_plot)

推荐阅读