检查变量是否处于一对一映射中

Rei*_*ica 9 r

假设我有一个数据框,其中R包含两个变量,我将其称为AB。我想检查这两个变量是否处于一对一映射中)。例如,考虑以下数据框:

DF <- data.frame(A = c(0,2,0,1,2,1,0,1,1,1),
                 B = c('H','M','H','W','M','W','H','W','W','W'));

DF;
   A B
1  0 H
2  2 M
3  0 H
4  1 W
5  2 M
6  1 W
7  0 H
8  1 W
9  1 W
10 1 W
Run Code Online (Sandbox Code Playgroud)

A在这个数据框中,我们可以通过检查看到和之间存在一一对应关系B(与0 = H1 = W2 = M)。我想找到一种方法来使用适当的R代码对更大的数据框执行此操作,而不需要我检查每个元素。代码应该生成一个简单明了的声明,说明指定变量之间是否存在一对一的关系;一个简单的TRUE/FALSE输出应该是理想的。

Jea*_*ams 6

我一直在寻找类似的功能,但也找不到。这就是我想出来的。它返回任何不匹配的表。

test121 <- function(mydat, col1, col2) {
  tab <- table(mydat[[col1]], mydat[[col2]])
  sumrows <- apply(tab>0, 1, sum)
  sumcols <- apply(tab>0, 2, sum)
  probrows <- sumrows>1
  extracols <- apply(tab[probrows, , drop=FALSE], 2, sum) >0
  probcols <- sumcols>1
  extrarows <- apply(tab[, probcols, drop=FALSE], 1, sum) >0
  out <- tab[probrows | extrarows, probcols | extracols]
  if(sum(dim(out))<1) {
    return("Columns match one-to-one")
  } else {
    return(out)
  }
}
Run Code Online (Sandbox Code Playgroud)

用你的数据:

> test121(DF, "A", "B")
[1] "Columns match one-to-one"
Run Code Online (Sandbox Code Playgroud)

您的数据中引入了一种不匹配:

> DF2 <- data.frame(
+     A = c(0, 2, 0, 1, 2, 1, 0, 1, 2, 1),
+     B = c("H", "M", "H", "W", "M", "W", "H", "W", "W", "W")
+   )
> test121(DF2, "A", "B")
   
    M W
  1 0 4
  2 2 1
Run Code Online (Sandbox Code Playgroud)


Rei*_*ica 2

使用包mappings中的函数utilities

\n

(注:这是CV.SE 上基本相同问题的答案的副本。 )

\n

您可以使用中mappings中的函数检查数据框中变量之间的函数映射。该函数接受输入数据帧并检查变量之间是否存在映射。默认情况下,该函数仅检查因子变量,但您可以通过设置检查数据中的所有变量。(请记住,应谨慎解释非因子变量之间的映射;连续变量几乎总是处于一对一映射中,因为它们没有重复值。)这是包含五个因子的模拟数据集的示例变量,它们之间有许多映射。utilitiesRall.vars = TRUE

\n
#Create data frame \nVAR1 <- c(0,1,2,2,0,1,2,0,0,1)\nVAR2 <- c(\'A\',\'B\',\'B\',\'B\',\'A\',\'B\',\'B\',\'A\',\'A\',\'B\')\nVAR3 <- c(1:10)\nVAR4 <- c(\'A\',\'B\',\'C\',\'D\',\'A\',\'B\',\'D\',\'A\',\'A\',\'B\')\nVAR5 <- c(1:5,1:5)\nDATA <- data.frame(VAR1 = factor(VAR1),\n                   VAR2 = factor(VAR2),\n                   VAR3 = factor(VAR3),\n                   VAR4 = factor(VAR4),\n                   VAR5 = factor(VAR5))\nDATA\n\n   VAR1 VAR2 VAR3 VAR4 VAR5\n1     0    A    1    A    1\n2     1    B    2    B    2\n3     2    B    3    C    3\n4     2    B    4    D    4\n5     0    A    5    A    5\n6     1    B    6    B    1\n7     2    B    7    D    2\n8     0    A    8    A    3\n9     0    A    9    A    4\n10    1    B   10    B    5\n
Run Code Online (Sandbox Code Playgroud)\n

我们可以使用下面的代码检查映射R。正如您所看到的,函数的输出向您显示了因素之间存在的所有函数关系,并且还告诉您哪些因素是“冗余”的(即其他因素的函数)。默认情况下,输出包括显示因子之间映射的 DAG 图。

\n
#Examine mappings in the data\nlibrary(utilities)\nMAPS <- mappings(DATA)\nMAPS\n\n\nMapping analysis for data-frame DATA containing 5 factors (analysis ignores NA values) \n\nThere were 7 mappings identified: \n \n     VAR1 \xe2\x86\x92 VAR2 \n     VAR3 \xe2\x86\x92 VAR1 \n     VAR3 \xe2\x86\x92 VAR2 \n     VAR3 \xe2\x86\x92 VAR4 \n     VAR3 \xe2\x86\x92 VAR5 \n     VAR4 \xe2\x86\x92 VAR1 \n     VAR4 \xe2\x86\x92 VAR2 \n\nRedundant factors: \n \n     VAR1 \n     VAR2 \n     VAR4 \n     VAR5 \n\nNon-Redundant factors: \n \n     VAR3\n
Run Code Online (Sandbox Code Playgroud)\n

在此输入图像描述

\n

从输出和绘图中可以看出,数据框中唯一的非冗余因子是VAR3;所有其他因子变量都是该变量的函数。(这也可以通过查看数据框中的值来确认。)

\n