我有一个数据框如下:
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。
答案 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