从数据帧在RevoScaleR中生成矩阵
我有一个数据框,如下所示:从数据帧在RevoScaleR中生成矩阵,r,revolution-r,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
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 400
C300
我想根据“年龄”生成一个矩阵,显示输入数据中“组”之间的相似性。例如,如果A组和B组有2个相似的年龄,则共同元素A和B将为2。一个带有
外部
的解决方案:
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
我们可以
将数据集(“df”)按“年龄”在数据集的子集(“df[-2]”上合并到自身中,即删除第二列),删除与“group.x”和“group.y”相同的行,并使用acast将唯一数据集(“df1”)从“长”重塑为“宽”
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
更新
关于新的数据集/预期结果,不清楚哪一列应包含在与“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
tbl您不必回答输出,而是在您的问题中:)@JIT基于新数据集的预期结果是什么。请在您的帖子中更新:-)这两个data.frame之间的链接是什么?你在要求什么,然后添加一个完全不同的东西。如果完全不同,请打开一个新问题。谢谢波维尔上校,这不是我预期的结果。您可以在下面的答案中看到我的预期结果。@JIT,请将预期结果添加到您原来的帖子中,而不是作为答案。好的,@Pascal,我将努力练习。因为这是我的第一个答案,所以我会有一些误解。你能告诉我df[-2]和by.x,by.y的意思吗。非常感谢。@JITdf[-2]
我正在对df
进行子集设置,因为第二列不再需要了。关于by.x/by.y
,这些是merge
中的参数,我们在其中指定两个相同数据集之间的公共列。否则,将使用所有列。如果列的类型为character?@JIT基于str(df)
,组列为character
,年龄为数字/整数,则该函数是否有效。对不起,我没听清你的问题。这是在r中做的方法。如果数据是一个包含400000行或更多行的文件,该怎么办。我使用RevoScaleR并使用rxReadNext()读取数据源中的每个数据块。在每个数据块中,我应用您的解决方案,但速度非常慢,大约需要30分钟谢谢。@akrun
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