Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从数据帧在RevoScaleR中生成矩阵_R_Revolution R - Fatal编程技术网

从数据帧在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的意思吗。非常感谢。@JIT
df[-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