我在 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)]
优点:
- 只需预先在非空
代码
上运行一次过滤器,而不是在每个组中运行 - 让
by=
为您处理unique(code)
逻辑。
注意事项:
- 示例中的代码仍将返回
ID
/num
对,其中没有非空代码;在我的方法中,通过首先过滤,这些对就会丢失。 nzchar(code)
与!(code == "")
不同 对于NA
输入 - - 请注意,nzchar(NA)
为TRUE
,而!(NA == "")
为NA
。如果您担心这一点,您可以将其更改为nzchar(code, keepNA = TRUE)
。请注意,""
与NA
(又名NA_character_
)不同。j
中的TRUE
是一次性的。如果更清楚的话,我们还可以编写unique(DT[nzchar(code)], by=c('ID', 'num', 'code'))
。我们必须在输出中重命名code
->agg_code
。
关于r - 这种独特/过滤语法如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67674157/