Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.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
R 带有data.table的嵌套分组_R_Data.table - Fatal编程技术网

R 带有data.table的嵌套分组

R 带有data.table的嵌套分组,r,data.table,R,Data.table,在下面的data.table中,我有关于参与项目的团队组成的信息。变量id告诉团队id,而变量event给出项目编号。变量freqrel描述了团队的组成(您可以看到,在每个团队中freqrel加起来等于1) 从这个开始的条件出发,我希望通过将团队没有的membr类型添加到每个团队中,使同一项目中的团队具有完全的可比性,将它们分配为freqrel=0。结果应该是: id event membr freqrel 1: 1 127b dentist 0.0

在下面的
data.table
中,我有关于参与项目的团队组成的信息。变量
id
告诉团队id,而变量
event
给出项目编号。变量
freqrel
描述了团队的组成(您可以看到,在每个团队中freqrel加起来等于1)

从这个开始的条件出发,我希望通过将团队没有的
membr
类型添加到每个团队中,使同一项目中的团队具有完全的可比性,将它们分配为freqrel=0。结果应该是:

    id event         membr   freqrel
 1:  1  127b       dentist 0.0000000  
 2:  1  127b      engineer 0.4000000
 3:  1  127b mathematician 0.4000000
 4:  1  127b     physicist 0.2000000
 5:  1  127b    programmer 0.0000000
 6:  1  127b       surgeon 0.0000000
--------------------------------------
 7:  2  127b       dentist 0.0000000  
 8:  2  127b      engineer 0.0000000
 9:  2  127b mathematician 0.1666667
 10: 2  127b     physicist 0.5000000
 11: 2  127b    programmer 0.0000000
 12: 2  127b       surgeon 0.3333333    
--------------------------------------
 13: 3  127b       dentist 0.3333333 
 14: 3  127b      engineer 0.0000000
 15: 3  127b mathematician 0.5000000
 16: 3  127b     physicist 0.0000000
 17: 3  127b    programmer 0.1666667
 18: 3  127b       surgeon 0.0000000   
_____________________________________
 19: 4  125t      musician 0.0000000
 20: 4  125t     physicist 0.7500000
 21: 4  125t   sociologist 0.1250000
 22: 4  125t       surgeon 0.1250000
--------------------------------------
 23: 5  125t      musician 0.4444444
 24: 5  125t     physicist 0.0000000
 25: 5  125t   sociologist 0.4444444
 26: 5  125t       surgeon 0.1111111
换句话说,在使用
event
作为键用
除以
后,我需要进行第二次分割,并比较通过第二次分割获得的数据块。 但这里的问题是,我不知道如何引用通过
by
获得的第一个块,然后如何再次拆分并在数据库的各个部分之间进行比较。你知道我该怎么解决这个问题吗

如果你能帮助我,我将不胜感激。真的。

这里有一个简单的方法:

setkey(dt, id, membr)
ans <- dt[, .SD[CJ(unique(id), unique(membr))], by=list(event)]

一些解释:您的问题归结为这一点-对于每个
事件
,您需要所有可能的
id、membr
组合,这样您就可以使用
.SD
对该分组中的所有组合执行联接


因此,首先我们根据
事件
进行分组,在该分组中,我们首先在
CJ
的帮助下获得
id,membr
的所有组合(默认情况下,将有一个键设置为所有列)。但是,要执行连接,我们需要为
.SD
设置键。因此,我们预先将
dt
键设置为
id,membr
。因此,我们在每个组中执行一个联接,这将为您提供预期的结果。希望这能有所帮助。

我非常感谢。我将研究你的解决方案,以完全理解它。非常感谢你,这帮了大忙。这是一个很好的解决方案,我很高兴我问了这个问题,因为你的回答让我意识到,我永远不会独自一人做到这一点。非常感谢。关于编码风格的一个很好的教训。@Arun@Riccardo:我知道这已经有一个多月的历史了,但我有两条评论,我认为可能很重要。首先,
.SD[CJ()]
零件只能按预期工作,因为默认情况下
nomatch=NA
。可能需要显式指定它,以便在默认值发生更改时安全。。。其次,考虑到它在
.SD
中的使用方式,
unique()
只包括
id
membr
的值,这些值是在根据
by=
对数据表进行子集化之后发现的,而不是在整个数据表中。这可能是这里的预期行为(每个
事件都有不同的
membr
),但可能不是。@Arun比抱歉更安全,我已经设法用
选项()改变默认设置(
),这是您慷慨提供的:)第二点,您的答案符合OP的要求,我的评论是针对他的,以防他忽略了区别。
    id event         membr   freqrel
 1:  1  127b       dentist 0.0000000  
 2:  1  127b      engineer 0.4000000
 3:  1  127b mathematician 0.4000000
 4:  1  127b     physicist 0.2000000
 5:  1  127b    programmer 0.0000000
 6:  1  127b       surgeon 0.0000000
--------------------------------------
 7:  2  127b       dentist 0.0000000  
 8:  2  127b      engineer 0.0000000
 9:  2  127b mathematician 0.1666667
 10: 2  127b     physicist 0.5000000
 11: 2  127b    programmer 0.0000000
 12: 2  127b       surgeon 0.3333333    
--------------------------------------
 13: 3  127b       dentist 0.3333333 
 14: 3  127b      engineer 0.0000000
 15: 3  127b mathematician 0.5000000
 16: 3  127b     physicist 0.0000000
 17: 3  127b    programmer 0.1666667
 18: 3  127b       surgeon 0.0000000   
_____________________________________
 19: 4  125t      musician 0.0000000
 20: 4  125t     physicist 0.7500000
 21: 4  125t   sociologist 0.1250000
 22: 4  125t       surgeon 0.1250000
--------------------------------------
 23: 5  125t      musician 0.4444444
 24: 5  125t     physicist 0.0000000
 25: 5  125t   sociologist 0.4444444
 26: 5  125t       surgeon 0.1111111
setkey(dt, id, membr)
ans <- dt[, .SD[CJ(unique(id), unique(membr))], by=list(event)]
ans[is.na(freqrel), freqrel := 0.0]