r - 这种独特/过滤语法如何工作?

标签 r data.table filtering grouping unique

我在 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)]

优点:

  1. 只需预先在非空代码上运行一次过滤器,而不是在每个组中运行
  2. by= 为您处理 unique(code) 逻辑。

注意事项:

  1. 示例中的代码仍将返回 ID/num 对,其中没有非空代码;在我的方法中,通过首先过滤,这些对就会丢失。
  2. nzchar(code)!(code == "") 不同 对于 NA 输入 - - 请注意,nzchar(NA)TRUE,而 !(NA == "")NA。如果您担心这一点,您可以将其更改为 nzchar(code, keepNA = TRUE)。请注意,""NA(又名 NA_character_)不同。
  3. j 中的 TRUE 是一次性的。如果更清楚的话,我们还可以编写 unique(DT[nzchar(code)], by=c('ID', 'num', 'code')) 。我们必须在输出中重命名 code->agg_code

关于r - 这种独特/过滤语法如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67674157/

相关文章:

r - 设置标记大小

R: kable_as_image 找不到 Ghostscript

r - 有效地计算一个数据框与另一个数据框的比例

r - 合并并平均列表中的每 15 个 data.frames

text - TinyMCE:如何禁用代码重写?

ios - Swift 过滤字符串数组

r - 如何在centos 6下安装R "rgl"包?

R data.table 获取 by block 的索引

r - 改变 ddply 的输出

Powershell:其中{_.Name不在$ object中}