为了进行数据分析,我正在从SPSS切换到R,并且我正在尝试编写一个可以用于大多数未来分析的scrpit。为了检验正态性,我想画出每个连续变量的直方图、QQ图和下降图。
为此,我希望R生成数据集中所有连续变量的as图,并以变量为标题。
我设法做到了这一点,首先选择所有数值变量并将它们存储为数据。
接下来,我尝试使用apply来生成所有列的qqplot。我设法做到了,但不幸的是,即使经过一天多的努力和尝试,我也没有成功地获得正确的标题。我需要知道如何编写代码来自动将变量(x)名称作为标题。有人知道怎么解决这个问题吗?
这就是我所做的,但根本不起作用:
apply(data.numerical, 2, function(x) {ggqqplot(x, title=colnames(data.numerical)[x])})提前感谢!
耶罗恩
发布于 2020-05-14 21:05:05
欢迎来到Stack Overflow和R!首先,我将提供一个解决方案,并提供一些关于将来在Stack Overflow上提问的提示。然后我会解释为什么你的尝试没有成功。
解决方案
下面是我的方法,在某些方面与您尝试的方法没有太大不同:
## Specify non-base packages needed
library(ggpubr)
## Generate example data
set.seed(123)
data.numerical <- data.frame(a = rnorm(100), b = rnorm(100))
## Make QQ plot for each column with the column's name as the title
sapply(names(data.numerical), function(x) {
print(ggqqplot(data = data.numerical, x = x, title = x))
})
## Or, equivalently
plots <- lapply(names(data.numerical), function(x) {
ggqqplot(data = data.numerical, x = x, title = x)
})
plots[[1]]
plots[[2]]以下是结果;您可以看到这些图的名称是恰当的:


注意我在绘制代码之前放在代码中的东西,指定了我正在使用的包,并为其他人提供了一种简单的方法来复制我的数据。在将来提出问题时,请提供这些东西;它们给我们提供了我们所称的最小可重复性示例,这有助于我们帮助您。
那么为什么我的尝试没有成功呢?
如果我们查看help("ggqqplot"),我们将看到该函数期望指定data以及绘制列x。因此,我没有对列执行apply()操作,而是对名称执行sapply()操作,以便以这种方式指定x。这对title参数也有帮助;因为我在名称上使用sapply(),所以可以直接将它们提供给title参数。
最重要的是,colnames(data.numerical)[x]并没有做你认为它正在做的事情。在您尝试的上下文中,x不是一个列索引,而是您数据框的一整列。因此,它不会像您所期望的那样设置列名的子集。
发布于 2020-05-14 21:30:09
欢迎!来强化@duckmayer中的一些观点。
expss用户的(提示,提示)。不要重复发明轮子。由于我碰巧有written a function来检查单变量发行版,所以我将使用它。没有人说它是最好的,但它就在这里。在实际情况中,您会发现dplyr::select_if使得从数据集中只选择数值变量变得很容易
library(dplyr)
library(purrr)
library(CGPfunctions)
playdata <- mtcars %>% select(hp, mpg, qsec)
titlevar <- names(playdata)
playdata %>% purrr::map2(.y = titlevar, ~ SeeDist(.x, whatplots = "d", title = .y))
#> Warning: There are 7 modal values displaying just the first 3



#> $hp
#> ------------------------------------------------------------------------------
#> .x
#>
#> length n NAs unique 0s mean meanCI'
#> 32 32 0 22 0 146.69 121.97
#> 100.0% 0.0% 0.0% 171.41
#>
#> .05 .10 .25 median .75 .90 .95
#> 63.65 66.00 96.50 123.00 180.00 243.50 253.55
#>
#> range sd vcoef mad IQR skew kurt
#> 283.00 68.56 0.47 77.10 83.50 0.73 -0.14
#>
#> lowest : 52.00, 62.00, 65.00, 66.00 (2), 91.00
#> highest: 215.00, 230.00, 245.00 (2), 264.00, 335.00
#>
#> ' 95%-CI (classic)
#>
#>
#> $mpg
#> ------------------------------------------------------------------------------
#> .x
#>
#> length n NAs unique 0s mean meanCI'
#> 32 32 0 25 0 20.09 17.92
#> 100.0% 0.0% 0.0% 22.26
#>
#> .05 .10 .25 median .75 .90 .95
#> 12.00 14.34 15.43 19.20 22.80 30.09 31.30
#>
#> range sd vcoef mad IQR skew kurt
#> 23.50 6.03 0.30 5.41 7.38 0.61 -0.37
#>
#> lowest : 10.40 (2), 13.30, 14.30, 14.70, 15.00
#> highest: 26.00, 27.30, 30.40 (2), 32.40, 33.90
#>
#> ' 95%-CI (classic)
#>
#>
#> $qsec
#> ------------------------------------------------------------------------------
#> .x
#>
#> length n NAs unique 0s mean meanCI'
#> 32 32 0 30 0 17.85 17.20
#> 100.0% 0.0% 0.0% 18.49
#>
#> .05 .10 .25 median .75 .90 .95
#> 15.05 15.53 16.89 17.71 18.90 19.99 20.10
#>
#> range sd vcoef mad IQR skew kurt
#> 8.40 1.79 0.10 1.42 2.01 0.37 0.34
#>
#> lowest : 14.50, 14.60, 15.41, 15.50, 15.84
#> highest: 19.90, 20.00, 20.01, 20.22, 22.90
#>
#> ' 95%-CI (classic)https://stackoverflow.com/questions/61797269
复制相似问题