如何不用for循环实现R data.table将向量元素逐个作为新列添加
实现方案
直接利用data.table := 运算符的多列批量赋值能力即可实现你要的效果,不需要for循环、也不会用到lapply或.SD:
foo <- data.table(col1 = 1:10, col2 = sample(letters[1:5], replace = TRUE)) fun.add <- function(DT) { v1 <- c(3, 5.5, 9) v2 <- c("x", "y", "z") # 完全符合你注释中提到的写法格式 DT[, paste0("aaa", 1:3) := as.list(v1)] DT[, paste0("bbb", 1:3) := as.list(v2)] } fun.add(foo)
原理说明
:=左侧传入长度为n的列名字符向量时,右侧只需要传入等长的列表,列表的每个元素就会作为对应列的常量值填充到整列,完全匹配「第j个新增列值为向量第j个元素」的需求。- 如果需要适配不定长的向量(比如向量长度为5时自动新增5列),可以把上面的
1:3替换为seq_along(v1)、seq_along(v2)即可,通用写法如下:
fun.add.general <- function(DT) { v1 <- c(3, 5.5, 9, 10, 12) # 长度为5的向量示例 v2 <- c("x", "y", "z", "m", "n") DT[, paste0("aaa", seq_along(v1)) := as.list(v1)] DT[, paste0("bbb", seq_along(v2)) := as.list(v2)] }
内容的提问来源于stack exchange,提问作者Discus23
相关产品推荐
相关产品推荐

