R 分解变量之间的相关性



我想知道是否有一种简单的方法来识别与另一个变量 100% 相关的字符/因素变量。因此,在示例中,该过程将匹配"颜色"和"车辆"以及"植物"和"高度"

color <- c('black', 'black', 'blue', 'blue', 'yellow')
vehicle <- c('truck', 'truck', 'car', 'car', 'bike')
plant <- c('tree', 'flower', 'grass', 'tree', 'flower')
height <- c('tall', 'medium', 'short', 'tall', 'medium')
df <- as.data.frame(cbind(color, vehicle, plant, height))

目前,我获取因子的水平编号并运行相关矩阵并提取相关性为 1 的对(除了自对)。

包比较工作:

library(tidyverse)
library(compare)
f <- function(x) factor(x, levels= unique(x))
f.df <- as.tibble(df) %>%
  mutate_if(is.character, f) %>%
  mutate_if(is.factor, as.numeric) 
compare(f.df$color, f.df$vehicle)
compare(f.df$color, f.df$plant)

要获取要测试的相关性,请执行以下操作:

cor <- cor(f.df)
cor[lower.tri(cor)] <- 0
vars.corr <- data.frame(cor) %>%
  mutate(var1= rownames(.)) %>%
  select(var1, everything()) %>%
  gather(var2, val, -var1) %>%
  filter(var1!= var2) %>%
  filter(val > .99)

但是我正在努力使用 map (purrr) 应用比较函数来迭代变量对(vars.corr 中的 var1 和 var2),或者编写一个函数并正确应用 enquo 以读取列表中的变量并应用于 f.df。

但现在这似乎是一个兔子洞,我想肯定有更简单的方法!感谢您的任何建议!

对于单个对:

perfect_cor <-   function (var1, var2) {
  all(rowSums(as.matrix(table(df[[var1]], df[[var2]])) > 0) == 1)
}
perfect_cor <- Vectorize(perfect_cor) # necessary for using `outer`

要对所有货币对应用此项:

outer(names(df), names(df), perfect_cor)

最新更新