r - 这种独特/过滤语法如何工作?
问题描述
我在 R 中创建了以下 data.table:
> DT
ID num code
1: b 1 C1
2: b 1 C1
3: b 1 C1
4: b 1 C1
5: b 1
6: b 3
7: b 3 C1
8: a 3 C2
9: a 3 C3
10: a 3 C3
11: a 3
12: c 4 C3
其中空值是空字符串""
。然后我运行指令
res <- DT[, .(agg_code = unique(code)[!(code == "")]), .(ID, num)]
这导致
> res
ID num agg_code
1: b 1 C1
2: b 1
3: b 1 <NA>
4: b 1 <NA>
5: b 3 C1
6: a 3 C2
7: a 3 C3
8: a 3
9: c 4 C3
我的问题是:这个命令实际上在做什么?我知道它是按 ID 和 num 分组的,我不明白它是如何unique(code)
工作[!(code == "")]
的。他们正在删除一些行,但他们也保留一些""
并创建一些<NA>
. 这里发生了什么?
为了完整起见,DT
由
DT = data.table(
ID = c("b","b","b", "b","b", "b","b","a","a","a","a", "c"),
num = c(1,1,1,1,1,3,3,3,3,3,3,4),
code = c("C1", "C1","C1","C1", "", "","C1", "C2", "C3", "C3","", "C3")
)
解决方案
FWIW我会以不同的方式编写代码:
res <- DT[nzchar(code), TRUE, by=.(ID, num, agg_code=code)]
优点:
- 只需预先在非空上运行
code
一次过滤器,而不是在每个组中运行它 - 让我们为您
by=
处理unique(code)
逻辑。
注意事项:
- 您示例中的代码仍将返回没有非空代码的
ID
/num
对;在我的方法中,通过首先过滤,这些对会丢失。 nzchar(code)
与!(code == "")
forNA
inputs不同——注意nzchar(NA)
是TRUE
while!(NA == "")
isNA
。如果这是一个问题,您可以将其更改为nzchar(code, keepNA = TRUE)
. 请注意,这""
与NA
(akaNA_character_
) 不同。TRUE
里面是j
一次性的。如果这更清楚,我们也可以写unique(DT[nzchar(code)], by=c('ID', 'num', 'code'))
。我们必须在输出中重命名code
->agg_code
。
推荐阅读
- cordova - 我的本地科尔多瓦插件在 ionic4 中不起作用,但在 ionic3 中起作用
- java - 具有唯一外键的表的冗余ID?
- symfony - 使用 HYDRATE_ARRAY 强制“获取加入”关系以包括其 ManyToOne 关系的 IDENTITY?
- javascript - 使用 Google Apps 脚本将一个 Google 电子表格中的特定数据复制到另一个 Google 电子表格
- c++ - 当我使用“cout<
有人能告诉我如何解决这个问题(在 C++ 中)吗?我尝试了很多方法来解决,但我不能
这是我的代码
- scikit-learn - 客户旅程的二元分类
- laravel - laravel:未定义变量:productsALL views\shop.blade.php
- c - 释放C中的内存
- pine-script - 使用多个条件创建研究指标
- javascript - 在 React 中过滤状态而不删除数据