【问题标题】:Create Boolean DF based on whether an observation appears under each variable from an intial DF根据观察是否出现在初始 DF 的每个变量下创建布尔 DF
【发布时间】:2020-10-09 00:47:39
【问题描述】:

我希望根据变量是否出现观察来获得 0/1。 For instance。场景是我有多个数据集,我想显示哪些数据集共享相同的变量。我已经有一个包含所有需要的数据框,如下所示:

ds1 <- c('A', 'B', 'C', 'D', 'E', 'G', 'I')
ds2 <- c('A', 'C', 'E', 'F', 'H', 'I', 'J')
ds3 <- c('B', 'D', 'F', 'G', 'H', 'I', 'J')
df <- data.frame(ds1, ds2, ds3)

我想生成一个类似于this answer 的图表,但我的数据设置不同。所以我的第一步是创建一个类似于该问题的布尔 df。我的想法是首先将 df 重新排列为两列,分别是数据集名称和变量名称 (df2)。然后将其与所有唯一变量名 (udf) 进行比较,根据它是否出现来判断为 TRUE/FALSE。

df2 <- gather(df, ds_name, var_name, 1:3)
udf <- unique(df2$var_name)

但是我在下一步中遇到了麻烦。我该怎么做?

【问题讨论】:

    标签: r dataframe boolean


    【解决方案1】:

    这是一个带有base R 的选项来创建表,然后使用ggplot

    library(ggplot2)
    ggplot(as.data.frame(table(names(df)[col(df)], unlist(df))),
           aes(x = Var1, y = Var2, fill = factor(Freq))) + 
           geom_tile(color='black')
    

    -输出


    或者来自janitortabyl的另一个选项

    library(janitor)
    library(dplyr)
    library(tidyr)
    df %>% 
         pivot_longer(everything()) %>% 
         tabyl(name, value) %>% 
         pivot_longer(cols = -name, names_to = 'name1') %>%
         ggplot(aes(x = name, y = name1, fill = factor(value))) + 
               geom_tile(color = 'black')
    

    【讨论】:

      【解决方案2】:

      检查上述解决方案后,您可以试试这个。对长宽格式数据进行整形以获得二进制值。然后再次整形为 long 和 plot。这里的代码使用tidyverse 函数。它接近你想要的:

      library(tidyverse)
      #Code
      df %>% pivot_longer(everything()) %>%
        mutate(var=1) %>%
        pivot_wider(names_from = value,values_from=var) %>%
        replace(is.na(.),0) %>%
        rename(data=name) %>%
        pivot_longer(-data) %>%
        ggplot(aes(x=data, y=name, fill=factor(value))) + geom_tile(color='black')+
        scale_fill_manual('Value',values = c('tomato','cyan3'))
      

      输出:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-10
        • 1970-01-01
        • 2023-01-23
        • 2023-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多