首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查两个列在R中是否存在一对一的关系。

检查两个列在R中是否存在一对一的关系。
EN

Stack Overflow用户
提问于 2022-09-28 13:40:20
回答 2查看 40关注 0票数 4

是否有任何现有的R功能来检查两列是否具有一对一的关系(不管列类型如何)。

预期产出实例:

代码语言:javascript
运行
复制
A    B     C
0    'a'   'apple'
1    'b'   'banana'
2    'c'   'apple'

A&B是一对一吗?真的

A&C是一对一吗?错误

B&C是一对一吗?错误

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-28 13:46:48

如果将一个向量传递给自己,它将返回一个整数向量,给出第一个索引,每个唯一值发生在。我们可以直接比较这些整数向量:

代码语言:javascript
运行
复制
is_one_to_one = function(x, y) {
  xu = match(x, x)
  yu = match(y, y)
  identical(xy, yu)
}

然后,您可以将其应用于每一对列。

将其封装在一个函数中:

代码语言:javascript
运行
复制
cor_1to1 = function(df) {
  mat = vapply(df, \(x) match(x, x), FUN.VALUE = integer(nrow(df)))
  nm = combn(colnames(mat), m = 2, FUN = paste, collapse = " :: ")
  val = combn(colnames(mat), m = 2, FUN = function(i) {
      identical(mat[, i[1]], mat[, i[2]])
    }, simplify = TRUE)
  setNames(val, nm)
}

# A :: B A :: C B :: C 
#   TRUE  FALSE  FALSE 
票数 3
EN

Stack Overflow用户

发布于 2022-09-28 14:02:02

你可以:

代码语言:javascript
运行
复制
one_to_one <- function(data){
  data[] <- sapply(data, \(x) match(x, x))
  pairs <- t(combn(seq_len(ncol(data)), 2))
  
  cbind(t(matrix(colnames(data)[t(pairs)], nrow = 2)),
        One2One = apply(pairs, 1, function(x) all(Reduce(`==`, data[, x])))) |>
    as.data.frame()
}

测试

代码语言:javascript
运行
复制
one_to_one(df)
#  V1 V2 One2One
#1  A  B    TRUE
#2  A  C   FALSE
#3  B  C   FALSE
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73882469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档