从数据帧生成RevoScaleR中的矩阵

时间:2015-02-03 07:45:49

标签: r revolution-r

我有一个数据框如下:

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

此数据框的预期结果。      A B C. A 0 4 3

B 4 0 0

C 3 0 0

我想生成一个矩阵,显示" group"在输入数据中,基于" age"。例如,如果A组和B组有2个相似的年龄,则公共元素A和B将为2。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我们可以merge数据集(" df")通过" age"在数据集的子集上(" df [-2]",即删除第二列),删除" group.x"的相同行。和" group.y",并重新整形来自" long"的唯一数据集(" df1")到"宽"使用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

更新

关于新数据集/预期结果,不清楚哪个列应包含在与&#34; re&#34;的关系中。在这里,我使用&#34; pro_id&#34;得到预期的结果。

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