【问题标题】:For Loop Across Specific Column Range in RFor循环遍历R中的特定列范围
【发布时间】:2020-07-10 13:39:09
【问题描述】:

我有一个包含 1000 行和 300 多列的宽数据框。前 2 列是 GroupID 和 Categorical 字段。其余列都是连续的数字测量。我想做的是循环遍历 R 中这些列的特定范围,从第一个数字列(第 3 列)开始。例如,循环浏览第 3:10 列。我还想在循环中保留列名。我已经开始使用以下代码

for(i in 3:ncol(df)){
  print(i)
} 

但这包括第 3 列右侧的所有列(不是 3:10 范围),这并不能识别列名。谁能帮助我开始这个循环,以便我可以指定列范围并保留列名?蒂亚!

旁注:我使用 tidyr 来收集长格式的数据帧。这行得通,但我发现它使我的数据框非常大,因此在我的循环中占用了大量的时间和内存。

【问题讨论】:

  • 您可以使用df[,3:10] 对数据进行子集化,无需循环,除非您需要计算一些东西;在这种情况下也不需要循环。您需要在 col 范围内做什么?
  • 谢谢,但我认为仍然需要某种循环。我需要使用 ggplot2 使用两个组变量之一生成每列的图表。所以我需要为指定的 x 个列生成 x 个图形。
  • 我添加了一个类似的绘图草图,使用与您的相同暗淡的虚拟数据。我希望这会有所帮助。

标签: r


【解决方案1】:

只要您不包含您的数据,我创建了一个类似的虚拟数据(1000 行和302 列,2 id vars),以便向您展示如何选择列,并为绘图做准备:

library(reshape2)
library(ggplot2)
set.seed(123)
#Dummy data
Numvars <- as.data.frame(matrix(rnorm(1000*300),nrow = 1000,ncol = 300))
vec1 <- 1:1000
vec2 <- rep(paste0('class',1:5),200)
IDs <- data.frame(vec1,vec2,stringsAsFactors = F)
#Bind data
Data <- cbind(IDs,Numvars)
#Select vars (in your case 10 initial vars)
df <- Data[,1:12]
#Prepare for plot
df.melted <- melt(data = df,id.vars = c('vec1','vec2'))
#Plot
ggplot(df.melted,aes(x=vec1,y=value,group=variable,color=variable))+
  geom_line()+
  facet_wrap(~vec2)

你最终会得到这样的情节:

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    您可以通过将列名输入lapply 函数来保留列名,这是 iris 数据集的示例:

      lapply(names(iris)[2:4], function(columntoplot){
    
       df <- data.frame(datatoplot=iris[[columntoplot]])
      
       graphname <- columntoplot
      
        ggplot(df, aes(x = datatoplot)) +
        geom_histogram() +
        ggtitle(graphname)
      
      ggsave(filename = paste0(graphname, ".png"), width = 4, height = 4)
      
    })
    

    lapply 函数中,您创建一个包含一列的新数据集(注意双括号)。然后,您可以在函数中绘制并选择保存输出(请参阅ggsave 行)。然后,您可以使用列名作为绘图标题以及文件名。

    【讨论】:

      猜你喜欢
      • 2016-01-01
      • 1970-01-01
      • 2023-02-17
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多