R 检查其他data.table中data.table值的频率

R 检查其他data.table中data.table值的频率,r,data.table,R,Data.table,什么是达到这一目的的有效方法 更新的示例:DT2实际上可能包含比DT1更多的组,因此这里有一个更新的示例: group popular 1: A TRUE 2: B TRUE 3: C FALSE 我将这样做:首先计算每个组在DT1中出现的次数,然后简单地将DT2和DT1连接起来 我会这样做: require(data.table) DT1 <- data.table(num = 1:6, group = c("A", "B", "B

什么是达到这一目的的有效方法

更新的示例:DT2实际上可能包含比DT1更多的组,因此这里有一个更新的示例:

    group popular
 1:     A    TRUE
 2:     B    TRUE
 3:     C   FALSE

我将这样做:首先计算每个组在DT1中出现的次数,然后简单地将DT2和DT1连接起来


我会这样做:

require(data.table)
DT1 <- data.table(num = 1:6, group = c("A", "B", "B", "B", "A", "C"))
DT2 <- data.table(group = c("A", "B", "C"))

#solution:
DT1[,num_counts:=.N,by=group] #the number of entries in this group, just count the other column
setkey(DT1, group)
setkey(DT2, group)
DT2 = DT1[DT2,mult="last"][,list(group, popular = (num_counts >= 2))]

#> DT2
#   group popular
#1:     A    TRUE
#2:     B    TRUE
#3:     C   FALSE
table的联接语法非常强大,在联接时,您还可以在j中聚合/选择/更新列。这里我们执行一个连接。对于DT2$group中的每一行,在DT1中对应的匹配行上,我们计算j表达式。N>=2L;通过指定by=.EACHI请检查,我们每次都计算j表达式

在1.9.4中。已作为别名引入所有i、j和by中。所以你也可以做:

## 1.9.4+
setkey(DT1, group)
DT1[J(DT2$group), list(popular = .N >= 2L), by = .EACHI]
#    group popular
# 1:     A    TRUE
# 2:     B    TRUE
# 3:     C   FALSE
# 4:     D   FALSE ## on the updated example
当通过单个字符列进行连接时,可以删除。/为了方便起见,我们使用了J语法。这也可以写成:

DT1[.(DT2$group), .(popular = .N >= 2L), by = .EACHI]

这可以通过聚合DT1而不是更新它来进一步简化。我认为更新更有效:聚合将涉及复制,而更新不需要任何复制DT2是否总是与DT1具有相同的唯一组?如果是这样,它只是DT1[,.popular=.N>=2L,by=group]Hi@Arun,不,它不是;对不起,我在这里过度简化了示例。DT2可能包含比DT1更多的组,在这种情况下,popular应该为FALSE,因为它至少两次没有包含在DT1$group中。+1对于精心设计的问题,这里是非数据表方式!tablefactorDT1$group,levels=uniqueDT2$group>=2专业数据表这是一个纯粹的魔术。您必须为未来的读者添加一些信息再投票一次,您将获得您的数据。今晚的table gold徽章:
require(data.table)
DT1 <- data.table(num = 1:6, group = c("A", "B", "B", "B", "A", "C"))
DT2 <- data.table(group = c("A", "B", "C"))

#solution:
DT1[,num_counts:=.N,by=group] #the number of entries in this group, just count the other column
setkey(DT1, group)
setkey(DT2, group)
DT2 = DT1[DT2,mult="last"][,list(group, popular = (num_counts >= 2))]

#> DT2
#   group popular
#1:     A    TRUE
#2:     B    TRUE
#3:     C   FALSE
## 1.9.4+
setkey(DT1, group)
DT1[J(DT2$group), list(popular = .N >= 2L), by = .EACHI]
#    group popular
# 1:     A    TRUE
# 2:     B    TRUE
# 3:     C   FALSE
# 4:     D   FALSE ## on the updated example
DT1[.(DT2$group), .(popular = .N >= 2L), by = .EACHI]
DT1[DT2$group, .(popular = .N >= 2L), by = .EACHI]