【问题标题】:histogram in R with for loopR中的直方图与for循环
【发布时间】:2020-01-06 14:34:21
【问题描述】:

我有一个包含 74 列的数据集,我正在尝试在 for 循环中为其中的每一列创建一个直方图。 在控制台中运行时,我的代码很好,但是当我尝试编织它时,R 说我的数据不是数字。有谁知道为什么?我也对绘制多个直方图的问题的其他解决方案持开放态度(将列名作为图上的标识符)。下面是我的问题的简化表示。

library(dplyr) 

data2 <- data.frame(c(1,3,5,5,2,2,1,1,1,1),
                    c(2,4,2,3,4,5,1,2,3,3))

colnames(data2) <- c("A", "B")

for (cols in colnames(data2)) {
  data2 %>% select(cols) %>% hist()
}

再次,逐行工作正常,但当我尝试编织时,我最终收到以下错误:

" hist.default(.) 中的错误:'x' 必须是数字调用:...freduce -> withVisible -> -> hist -> hist.default

执行停止”

有趣的是,这段代码编织得很好:

library(dplyr)

data2 <- data.frame(c(1,3,5,5,2,2,1,1,1,1),
                    c(2,4,2,3,4,5,1,2,3,3))

colnames(data2) <- c("A", "B")

hist(data2$A)
hist(data2$B)

【问题讨论】:

  • 只是关于隔离问题的评论:这与knitr 无关,如果您在脚本或 Rmd 文档中运行 R 代码,则会遇到相同的错误。因为无论你是否使用 knitr 都存在问题,所以我删除了 knitr 标签和标题中的提及。

标签: r for-loop


【解决方案1】:

您可以简单地使用lapply

lapply(data2, hist)

编辑:当然你可以随意扩展它,例如标题、标签。

op <- par(mfrow=c(1, 2))  # to put histograms side by side
lapply(seq(data2), function(x) 
  hist(x=data2[[x]], xlab=names(data2)[x], main=paste("Histogram", names(data2)[x])))
par(op)  # restore

【讨论】:

  • 谢谢,但我使用 for 循环而不是 lapply 的原因是我想保留主标题或 x 轴标题的列名。
【解决方案2】:

select单个列会创建一个 1 列数据框。 hist 需要一个数字向量,而不是数据框。改用pull 将列提取为向量:

for (cols in colnames(data2)) {
  data2 %>% pull(cols) %>% hist()
}

我也不确定您所说的“我的逐行代码工作正常”是什么意思,我将代码从 for 循环中取出时遇到了同样的错误(但 pull 仍然工作正常):

data2 %>% select(A) %>% hist
# Error in hist.default(.) : 'x' must be numeric

【讨论】:

  • 感谢您将我指向拉。我所说的“逐行”是指在控制台中而不是编织它。
  • 如果人们有兴趣,我保留列名的最终代码是:
  • 是的,但是控制台中的data2 %&gt;% select(A) %&gt;% hist,或者控制台中的for循环,都会抛出同样的错误。
  • 有趣,因为它在我的控制台中运行良好。 ¯_(ツ)_/¯
【解决方案3】:

谢谢,格雷戈尔。如果人们有兴趣,我保留列名以供参考的最终代码是:

for (cols in colnames(data2)) {
  data2 %>% pull(cols) %>% hist(main = cols)
}

【讨论】:

    【解决方案4】:

    如果你愿意,这也可以在 base.R 中工作。

    data2 <- data.frame(c(1,3,5,5,2,2,1,1,1,1),
                        c(2,4,2,3,4,5,1,2,3,3))
    
    colnames(data2) <- c("A", "B")
    
    for(x in names(data2)) {
      hist(data2[,x], main = paste(x, 'distribution' ))
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-11
      • 2014-02-09
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多