假设我有一个数据框,其中R包含两个变量,我将其称为A和B。我想检查这两个变量是否处于一对一映射中)。例如,考虑以下数据框:
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 = H、1 = W和2 = M)。我想找到一种方法来使用适当的R代码对更大的数据框执行此操作,而不需要我检查每个元素。代码应该生成一个简单明了的声明,说明指定变量之间是否存在一对一的关系;一个简单的TRUE/FALSE输出应该是理想的。
我一直在寻找类似的功能,但也找不到。这就是我想出来的。它返回任何不匹配的表。
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)
mappings中的函数utilities(注:这是CV.SE 上基本相同问题的答案的副本。 )
\n您可以使用中包mappings中的函数检查数据框中变量之间的函数映射。该函数接受输入数据帧并检查变量之间是否存在映射。默认情况下,该函数仅检查因子变量,但您可以通过设置检查数据中的所有变量。(请记住,应谨慎解释非因子变量之间的映射;连续变量几乎总是处于一对一映射中,因为它们没有重复值。)这是包含五个因子的模拟数据集的示例变量,它们之间有许多映射。utilitiesRall.vars = TRUE
#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\nRun Code Online (Sandbox Code Playgroud)\n我们可以使用下面的代码检查映射R。正如您所看到的,函数的输出向您显示了因素之间存在的所有函数关系,并且还告诉您哪些因素是“冗余”的(即其他因素的函数)。默认情况下,输出包括显示因子之间映射的 DAG 图。
#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\nRun Code Online (Sandbox Code Playgroud)\n\n从输出和绘图中可以看出,数据框中唯一的非冗余因子是VAR3;所有其他因子变量都是该变量的函数。(这也可以通过查看数据框中的值来确认。)