r - A 列按 B 列分组的组间(组间)组合

标签 r combinations

我认为这是一个图论问题:我们可以在两组点之间画多少条线...我不熟悉...

例如

df = data.frame(city = c('Boston', 'Cambridge', 'Long Island', 'NYC'),
                state = c('MA', 'MA', 'NY', 'NY'))

         city state
1      Boston    MA
2   Cambridge    MA
3 Long Island    NY
4         NYC    NY

城市按州划分/分组。如何获得

Boston - Long Island
Boston - NYC
Cambridge - Long Island
Cambridge - NYC

换句话说,我想生成每个城市对,其中两个城市位于不同的州。

一个更一般的例子:

set.seed(123)
df = data.frame(value = 1:100,
                group = letters[sample(1:26, 100, replace=T)])

> df
    value group
1       1     e
2       2     m
3       3     g
4       4     o
5       5     p
6       6     a
7       7     i
8       8     o
9       9     i
10     10     h
11     11     p
12     12     h
...    ...    ...

我想要所有组合(value1,value2)或等效的(index1,index2),其中value1和value2具有不同的组标签。

最佳答案

扩展 @mso 答案,如果您:

  1. 只想计算可能的对的数量
  2. a->b 与 b->a 相同(无向图)。

    > set.seed(123)
    > n<-10 # number of value
    > k<-3  # number of groups
    > df = data.frame(value = 1:n,  group = letters[sample(1:k, n, replace=T)])
    > df
       value group
    1      1     a
    2      2     c
    3      3     b
    4      4     c
    5      5     c
    6      6     a
    7      7     b
    8      8     c
    9      9     b
    10    10     b
    
    > tbl<-table(df$group) # Tabulate number within each group
    > tbl
    a b c
    2 4 4
    > sum(outer(tbl,tbl)[upper.tri(outer(tbl,tbl))]) # Count number of pairs
    [1] 32
    > sum(apply(combn(1:length(tbl),2),2,function(x) prod(tbl[x]) )) # Another way
    [1] 32
    
    >for(i in 1:n){
      tempdf = df[df$group!=df[i,2] & c(rep(F,i),rep(T,n-i)),]
      cat(df[i,1],': ',tempdf[,1], '\n')
    }
    
    1 :  2 3 4 5 7 8 9 10
    2 :  3 6 7 9 10
    3 :  4 5 6 8
    4 :  6 7 9 10
    5 :  6 7 9 10
    6 :  7 8 9 10
    7 :  8
    8 :  9 10
    9 :
    10 :
    
    >count<-0
    >for(i in 1:n){
      tempdf = df[df$group!=df[i,2] & c(rep(F,i),rep(T,n-i)),]
      if (nrow(tempdf)>0){
        for(j in 1:nrow(tempdf)){
          cat(df[i,1], tempdf[j,1], '\n')
          count<-count+1
        }
      }
    }
    
     1 2
     1 3
     1 4
     1 5
     1 7
     1 8
    ...
    
    > count
    [1] 32
    

关于r - A 列按 B 列分组的组间(组间)组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33382046/

相关文章:

python - 生成一个 numpy 数组,其中包含总和小于给定数字的所有数字组合

matlab - 一组给定元素的唯一(有限长度)组合 - 在 Matlab 中的实现

r - 使用 ggforce facet_zoom 操纵 y 轴比例

algorithm - 生成所有长度为 n 且设置了 k 位的二进制字符串

c++ - 无需查找的快速独特组合(来自重复列表)

algorithm - 打印数组的所有产品组合

r - 如何将函数应用于 R 中数据框中的特定列集以替换 NA

r - 从 R 中的 WKT 点数据中提取并分割经纬度坐标

R:何时使用 stringsAsFactors

r - ggplot2:geom_histogram 无法处理大的异常值?