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"))
Run Code Online (Sandbox Code Playgroud)
我想将列添加popular到DT2与价值TRUE,每当DT2$group被包含在DT1$group至少两次.所以,在上面的例子中,DT2应该是
group popular
1: A TRUE
2: B TRUE
3: C FALSE
Run Code Online (Sandbox Code Playgroud)
什么是有效的方法来达到这个目的?
更新的示例: 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"))
Run Code Online (Sandbox Code Playgroud)
并且期望的输出将是
group popular
1: A TRUE
2: B TRUE
3: C FALSE
4: D FALSE
Run Code Online (Sandbox Code Playgroud)
Aru*_*run 10
我只是这样做:
## 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
Run Code Online (Sandbox Code Playgroud)
data.table连接语法非常强大,因为在加入时,您还可以聚合/选择/更新列j.在这里我们执行连接.对于每个行中DT2$group的相应匹配行DT1,我们计算j-expression .N >= 2L; 通过指定by = .EACHI(请检查1.9.4 NEWS),我们j每次计算-expression.
在1.9.4,.()已被引入作为所有的别名i,j和by.所以你也可以这样做:
DT1[.(DT2$group), .(popular = .N >= 2L), by = .EACHI]
Run Code Online (Sandbox Code Playgroud)
当您通过单个字符列加入时,可以完全删除.()/ J()syntax(为方便起见).所以这也可以写成:
DT1[DT2$group, .(popular = .N >= 2L), by = .EACHI]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
310 次 |
| 最近记录: |