我认为这是一个图论问题:我们可以在两组点之间画多少条线...我不熟悉...
例如
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 答案,如果您:
- 只想计算可能的对的数量
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/