-1

我有一个数据框如下:

group   sex    age
    A     M     15
    A     F     17
    A     M     12
    A     F      2
    A     F      6
    A     M      3
    A     M     10
    A     M     18
    B     F     16
    B     M      6
    B     M     18
    B     M     15
    B     F      8
    B     F     17
    B     M     18
    B     M     16
    B     F     13
    B     F      5
    B     F     13
    B     F      4
    B     M     15
    B     M      8
    B     M     18
    C     F      7
    C     M     12
    C     M      3
    C     F      1
    C     F      9
    C     F      2

此数据帧的预期结果。ABC A 0 4 3

乙 4 0 0

C 3 0 0

我想根据“年龄”生成一个矩阵,显示输入数据中“组”之间的相似性。例如,如果 A 组和 B 组有 2 个相似的年龄,那么 A 和 B 的共同元素将为 2。

4

2 回答 2

1

我们可以merge通过数据集子集(“df[-2]”,即第二列被删除)上的“age”将数据集(“df”)自身,删除与“group.x”相同的行" 和 "group.y",并使用acast.

 df1 <- subset(merge(df[-2], df[-2], by.x='age',
                          by.y='age'), group.x!=group.y)

 library(reshape2)
 acast(unique(df1), group.x~group.y, value.var='age')
 #   A B C
 #A 0 4 3
 #B 4 0 0
 #C 3 0 0

或使用xtabs来自 base R

 xtabs(~group.x+group.y, unique(df1))
 #     group.y
 #group.x A B C
 #      A 0 4 3
 #      B 4 0 0
 #      C 3 0 0

更新

关于新的数据集/预期结果,尚不清楚哪一列应包含在与“re”的关系中。在这里,我使用“pro_id”来获得预期的结果。

tbl <- crossprod(table(df[c(3,1)]))
 diag(tbl) <- 0
 tbl
 #     re
 #re    144 205 209 222 235 250
 # 144   0   1   2   0   0   0
 # 205   1   0   1   0   0   0
 # 209   2   1   0   0   0   0
 # 222   0   0   0   0   0   1
 # 235   0   0   0   0   0   0
 # 250   0   0   0   1   0   0
于 2015-02-03T09:07:56.917 回答
1

一种解决方案outer

library(magrittr)

func = Vectorize(function(u,v)
{
    if(all(u==v)) return(0)
    intersect(subset(df, group==u)$age, subset(df, group==v)$age) %>% unique %>% length 
})

x = df$group %>% unique
m = outer(x, x, func)
row.names(m) = colnames(m) = x

#>m
#  A B C
#A 0 4 3
#B 4 0 0
#C 3 0 0
于 2015-02-03T08:46:56.757 回答