根据观察值是否出现在初始 DF 的每个变量下来创建布尔 DF

Create Boolean DF based on whether an observation appears under each variable from an intial DF

我想根据变量是否出现观察结果得到 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)

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

检查完上述解决方案后,您可以试试这个。以长格式和宽格式重塑数据以获得二进制值。然后再次重塑为 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'))

输出:

这里有一个选项 base R 创建 table 然后使用 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')

-输出


tabyl 来自 janitor

的另一个选项
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')