【问题标题】:R: Automatically recognizing the "type" of variableR:自动识别变量的“类型”
【发布时间】:2021-09-27 17:10:26
【问题描述】:

我正在使用 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 个这样的图表?)

谢谢

【问题讨论】:

  • 你可以只用这两种图表类型创建一个函数,然后如果某个变量是因子类型或数字类型(例如@987654325 @ 或 class(x) 或其他方式,然后简单地在你的图之前放置一个 if else 条件,上面写着“如果数字则做直方图,否则做密度图”。哦,当然,如果你想自动应用于一堆变量,那么您可能希望将所有内容放入一个逐列遍历数据的 for 循环中。
  • if-statement 中,您可以使用例如is.numericis.factoris.character(这样你就知道你有一个字符需要转换为你的情况下的一个因素)

标签: r ggplot2 data-visualization


【解决方案1】:

我们可以试试这个解决方案:

  1. 转换为小标题
  2. type.convert(as.is = TRUE)获取最真实的类型
  3. 将所有整数转换为所有列中的因子
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) 

【讨论】:

    【解决方案2】:

    您可以使用 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)))
    

    【讨论】:

    • 这是完美的,谢谢!系统告诉我需要等待 5 分钟才能“接受”你的回答
    • 你知道为什么密度图看起来“不均匀”吗?
    • 嗯..我不确定。
    • 我修复了直方图的问题:ggplot(my_data) + geom_bar(aes(x = var_2, fill = factor(response)), position = position_dodge(preserve = 'single'))跨度>
    猜你喜欢
    • 2015-10-23
    • 2016-08-25
    • 2017-02-02
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多