【问题标题】:Check frequency of data.table value in other data.table检查其他data.table中data.table值的频率
【发布时间】:2014-12-14 16:56:17
【问题描述】:
 library(data.table)
 DT1 <- data.table(num = 1:6, group = c("A", "B", "B", "B", "A", "C"))
 DT2 <- data.table(group = c("A", "B", "C"))

只要DT2$group 包含在DT1$group 中至少两次,我就想在DT2 中添加一列popular,其值为TRUE。所以,在上面的例子中,DT2 应该是

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

什么是实现这一目标的有效方法?

更新示例: DT2 实际上可能包含比DT1 更多的组,所以这里是一个更新示例:

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

期望的输出是

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

【问题讨论】:

  • DT2 是否总是具有与DT1 相同的唯一group?如果是这样,那就是DT1[, .(popular = .N &gt;= 2L), by=group]
  • 嗨@Arun,不,它没有;对不起,我在这里过度简化了示例。 DT2 可能包含比DT1 更多的组,在这种情况下,流行的应该是FALSE(因为它不包含在DT1$group 中至少两次)。
  • +1 表示精心设计的问题
  • 这里是非数据表方式! table(factor(DT1$group, levels = unique(DT2$group))) &gt;= 2

标签: r data.table


【解决方案1】:

我会这样做:

## 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

data.table的join语法非常强大,在join的同时,你还可以聚合/选择/更新j中的列。在这里我们执行一个连接。对于DT2$group中的每一行,在DT1中对应的匹配行上,我们计算j-表达式.N &gt;= 2L;通过指定by = .EACHI(请检查1.9.4 NEWS),我们每次都计算j-表达式。


1.9.4 中,.() 已作为别名引入所有ijby。所以你也可以这样做:

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

当您通过单个字符列加入时,您可以完全删除 .() / J() 语法(为方便起见)。所以这也可以写成:

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

【讨论】:

  • 专业数据表
  • 那是纯粹的魔法。您必须为未来的读者添加一些信息
  • 多投一票,今晚您将获得data.table 金牌 :)
【解决方案2】:

我会这样做:首先计算每个组在DT1 中出现的次数,然后简单地加入DT2DT1

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

【讨论】:

  • 这可以通过聚合DT1 而不是updating 来进一步简化。
  • 我认为更新更有效:聚合会涉及复制,而更新不需要任何复制
猜你喜欢
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 2014-06-26
  • 2018-07-31
  • 2018-09-18
  • 1970-01-01
相关资源
最近更新 更多