【问题标题】:R How to compute a unique index for two character variables with varing columns? [duplicate]R如何计算具有不同列的两个字符变量的唯一索引? [复制]
【发布时间】:2021-08-27 17:23:49
【问题描述】:

我不确定我是否正确地表达了我的问题,所以让我举一个简化的例子:

给定一个数据集如下:

dat <- data_frame(X = c("A", "B", "B", "C", "A"), 
                  Y = c("B", "A", "C", "A", "C"))

如何计算pair 变量,以便它表示给定行中XY 中的任何内容不会产生重复项,如下所示:

dat$pair <- c("A-B", "A-B", "B-C", "C-A", "C-A")
dat
# A tibble: 5 × 3
  X     Y     pair 
  <chr> <chr> <chr>
1 A     B     A-B  
2 B     A     A-B  
3 B     C     B-C  
4 C     A     C-A  
5 A     C     C-A  

我可以计算与 paste0 的配对,但它会引入我想避免的重复项(C-AA-C 相同):

> dat <- mutate(dat, pair = paste0(X, "-", Y))
> dat
# A tibble: 5 × 3
  X     Y     pair 
  <chr> <chr> <chr>
1 A     B     A-B  
2 B     A     B-A  
3 B     C     B-C  
4 C     A     C-A  
5 A     C     A-C  

【问题讨论】:

  • 您的数据是否仅包含大写字母和每个元素中的一个字母?
  • @blazej 顺序重要吗?例如,用A-CA-C 代替C-AC-A 是否可以接受?
  • @Peter,不 - 它实际上更长的字符串与多个聊天者
  • @Ben 是的,没关系

标签: r dplyr


【解决方案1】:

我们可以使用pminpmax 对值进行并行排序,并使用paste 它们。

transform(dat, pair = paste(pmin(X, Y), pmax(X, Y), sep = '-'))

#  X Y pair
#1 A B  A-B
#2 B A  A-B
#3 B C  B-C
#4 C A  A-C
#5 A C  A-C

如果你更喜欢dplyr,这可以写成-

library(dplyr)

dat %>% mutate(pair = paste(pmin(X, Y), pmax(X, Y), sep = '-'))

【讨论】:

  • 这里介绍的所有解决方案都很好,但这是真正的交易:) 我一直想问,我们何时将pmaxpmin 应用于应用于每一行的数据集,对吗?
【解决方案2】:

我对每一列重新排序一次

dat <- data.frame(X = c("A", "B", "B", "C", "A"), 
                  Y = c("B", "A", "C", "A", "C"))

library(dplyr)


dat %>%
rowwise %>%
mutate(pair = paste0(sort(c(as.character(X),as.character(Y)),decreasing = F),collapse = '-')) %>%
ungroup

输出;

X     Y     pair 
  <fct> <fct> <chr>
1 A     B     A-B  
2 B     A     A-B  
3 B     C     B-C  
4 C     A     A-C  
5 A     C     A-C  

【讨论】:

    【解决方案3】:

    使用dplyrtidyr 你可以试试:

    library(dplyr)
    library(tidyr)
    
    dat %>% 
      rowwise() %>% 
      mutate(pair = list(c(X, Y)),
             pair = list(sort(pair)),
             pair = list(paste(pair, collapse = "-"))) %>% 
      select(pair) %>% 
      distinct() %>% 
      unnest(pair)
    #> # A tibble: 3 x 1
    #>   pair 
    #>   <chr>
    #> 1 A-B  
    #> 2 B-C  
    #> 3 A-C
    

    reprex package (v2.0.0) 于 2021 年 8 月 27 日创建

    数据

    dat <- data.frame(X = c("A", "B", "B", "C", "A"), 
                      Y = c("B", "A", "C", "A", "C"))
    

    【讨论】:

    • 感谢@Peter,我选择了@Samet 响应,因为它返回所有列,而不仅仅是配对。顺便说一句,在您的代码中pair = list(sort(pair)) 之后缺少一个逗号 :)
    • 感谢您的反馈。加了逗号,我的省略。如果您想要所有对,只需删除 distinct() 参数。我对您的问题的解读是您想“避免重复对”。
    猜你喜欢
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2014-11-19
    • 2020-11-09
    相关资源
    最近更新 更多