R:自动识别变量的"type"
R: Automatically recognizing the "type" of variable
我正在使用 R 编程语言。假设我有以下数据:
#create data
var_1 = rnorm(1000,10,10)
var_2 <- c("1","0")
var_2 <- sample(var_1, 1000, replace=TRUE, prob=c(0.3, 0.7))
response<- c("2", "1","0")
response <- sample(response, 1000, replace=TRUE, prob=c(0.3, 0.4, 0.3))
my_data = data.frame(var_1, var_2, response)
my_data$var_2 = as.factor(my_data$var_2)
my_data$response = as.factor(my_data$response)
我编写了以下代码,为“因子”变量绘制直方图,为“数值”变量绘制密度图:
#load libraries
library(ggplot2)
library(gridExtra)
#first plot
p1 = ggplot(my_data) +
geom_histogram(aes(x=var_1, fill=response),
colour="grey50", alpha=0.5, position="identity")+ ggtitle("var_2 vs response")
#second plot (for some reason, this does not look correct?)
p2 = ggplot(my_data, aes(x = var_2, fill = response)) + geom_density(alpha = 0.5) + ggtitle("var_1 vs response")
grid.arrange(p1, p2, ncol=2)
我的问题:假设我有一个包含许多“因子”变量和“数值”变量的数据集。 R中有没有函数可以自动检测变量是“因子”还是“数值”,然后绘制相应的图形(使用“响应变量”的颜色填充)?
是否可以自动生成这些图表,而无需手动指示 R 为每个变量“类型”制作正确的图表类型? (例如,假设数据集中有 10 个变量,是否可以制作 10 个这样的图表?)
谢谢
您可以使用 lapply
-
library(ggplot2)
library(gridExtra)
var_cols <- grep('var', names(my_data), value = TRUE)
do.call(grid.arrange, c(lapply(var_cols, function(x) {
if(is.numeric(my_data[[x]])) {
ggplot(my_data) +
geom_histogram(aes(x=.data[[x]], fill=response),
colour="grey50", alpha=0.5, position="identity") +
ggtitle(paste(x, 'vs response'))
}
else {
ggplot(my_data, aes(x = .data[[x]], fill = response)) +
geom_density(alpha = 0.5) +
ggtitle(paste(x, 'vs response'))
}
}), ncol = length(var_cols)))
我们可以尝试这个解决方案:
- 转换为 tibble
type.convert(as.is = TRUE)
获得最真实的类型
- 将所有整数转换为跨所有列的因子
library(tidyverse)
library(gridExtra)
my_data1 <- my_data %>%
as_tibble() %>%
type.convert(as.is = TRUE) %>%
mutate(across(where(is.integer), factor))
#first plot
p1 = ggplot(my_data1) +
geom_histogram(aes(x=var_1, fill=response),
colour="grey50", alpha=0.5, position="identity")+ ggtitle("var_2 vs response")
#second plot (for some reason, this does not look correct?)
p2 = ggplot(my_data1, aes(x = var_2, fill = response)) + geom_density(alpha = 0.5) + ggtitle("var_1 vs response")
grid.arrange(p1, p2, ncol=2)
我正在使用 R 编程语言。假设我有以下数据:
#create data
var_1 = rnorm(1000,10,10)
var_2 <- c("1","0")
var_2 <- sample(var_1, 1000, replace=TRUE, prob=c(0.3, 0.7))
response<- c("2", "1","0")
response <- sample(response, 1000, replace=TRUE, prob=c(0.3, 0.4, 0.3))
my_data = data.frame(var_1, var_2, response)
my_data$var_2 = as.factor(my_data$var_2)
my_data$response = as.factor(my_data$response)
我编写了以下代码,为“因子”变量绘制直方图,为“数值”变量绘制密度图:
#load libraries
library(ggplot2)
library(gridExtra)
#first plot
p1 = ggplot(my_data) +
geom_histogram(aes(x=var_1, fill=response),
colour="grey50", alpha=0.5, position="identity")+ ggtitle("var_2 vs response")
#second plot (for some reason, this does not look correct?)
p2 = ggplot(my_data, aes(x = var_2, fill = response)) + geom_density(alpha = 0.5) + ggtitle("var_1 vs response")
grid.arrange(p1, p2, ncol=2)
我的问题:假设我有一个包含许多“因子”变量和“数值”变量的数据集。 R中有没有函数可以自动检测变量是“因子”还是“数值”,然后绘制相应的图形(使用“响应变量”的颜色填充)?
是否可以自动生成这些图表,而无需手动指示 R 为每个变量“类型”制作正确的图表类型? (例如,假设数据集中有 10 个变量,是否可以制作 10 个这样的图表?)
谢谢
您可以使用 lapply
-
library(ggplot2)
library(gridExtra)
var_cols <- grep('var', names(my_data), value = TRUE)
do.call(grid.arrange, c(lapply(var_cols, function(x) {
if(is.numeric(my_data[[x]])) {
ggplot(my_data) +
geom_histogram(aes(x=.data[[x]], fill=response),
colour="grey50", alpha=0.5, position="identity") +
ggtitle(paste(x, 'vs response'))
}
else {
ggplot(my_data, aes(x = .data[[x]], fill = response)) +
geom_density(alpha = 0.5) +
ggtitle(paste(x, 'vs response'))
}
}), ncol = length(var_cols)))
我们可以尝试这个解决方案:
- 转换为 tibble
type.convert(as.is = TRUE)
获得最真实的类型- 将所有整数转换为跨所有列的因子
library(tidyverse)
library(gridExtra)
my_data1 <- my_data %>%
as_tibble() %>%
type.convert(as.is = TRUE) %>%
mutate(across(where(is.integer), factor))
#first plot
p1 = ggplot(my_data1) +
geom_histogram(aes(x=var_1, fill=response),
colour="grey50", alpha=0.5, position="identity")+ ggtitle("var_2 vs response")
#second plot (for some reason, this does not look correct?)
p2 = ggplot(my_data1, aes(x = var_2, fill = response)) + geom_density(alpha = 0.5) + ggtitle("var_1 vs response")
grid.arrange(p1, p2, ncol=2)