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]