如何使用data.table在特定条件下以短横线拼接两列并正确处理空值
用data.table实现含NA列的拼接并保留全NA行为NA
你遇到的问题根源在于提前把所有NA替换成了空字符串,所以当两行都是NA的时候,拼接出来就是"-"。我们可以直接在生成新列的时候加入判断,来实现想要的效果:
首先,先构造你的示例数据(方便复现):
library(data.table) df <- data.table( ID = c(1, 2, 3), value1 = c("wad", NA, "elf"), value2 = c(11, NA, 1) )
然后使用下面的代码处理:
df[, new := ifelse(is.na(value1) & is.na(value2), NA_character_, paste0(value1, "-", value2))][, .(ID, new)]
运行后就能得到你想要的结果:
| ID | new |
|---|---|
| 1 | wad-11 |
| 2 | NA |
| 3 | elf-1 |
为什么这个方法有效?
- 我们没有提前把NA替换为空字符串,而是先判断
value1和value2是否同时为NA:- 如果是,就给
new赋值NA_character_(明确指定是字符型NA,避免类型不匹配的问题); - 如果不是,就用
paste0直接拼接两个值,正常保留非NA的内容。
- 如果是,就给
如果你还需要处理“其中一个值为NA,另一个非NA”的情况(比如value1是NA,value2是5,想要new为NA-5这类形式),这个逻辑也能直接适用,不需要额外修改。
内容的提问来源于stack exchange,提问作者user13467695
相关产品推荐
相关产品推荐

