如何按data.table的一列分组,从另一列生成嵌套向量?
问题与解决
问题背景
给定data.table数据集:
Col_1 <- c("A", "A", "A", "B", "B", "B") Col_2 <- c("AA", NA, "AA", NA, "BB", "BBB") dt <- data.table(Col_1, Col_2)
需求是按Col_1分组,新增列c3存储对应分组下Col_2所有元素组成的嵌套向量,期望输出:
Col_1 c3 <char> <list> 1: A c("AA", NA, "AA") 2: B c(NA, "BB", "BBB")
尝试代码后未得到预期结果:
dt[, .(c3= sapply(Col_2,c)) , .(Col_1)]
错误输出(每行对应一个元素,未合并为嵌套向量):
Col_1 c3 <char> <list> 1: A AA 2: A NA 3: A AA 4: B NA 5: B BB 6: B BBB
正确解法
在data.table中,直接通过list()将分组后的Col_2打包为列表列即可,无需使用sapply:
写法1:基础写法
dt[, .(c3 = list(Col_2)), by = Col_1]
写法2:data.table简写语法
dt[, .(c3 = .(Col_2)), by = Col_1]
执行后得到预期输出:
Col_1 c3 <char> <list> 1: A AA,NA,AA 2: B NA,BB,BBB
错误原因
之前使用sapply(Col_2, c)会将Col_2的每个元素单独转换为向量,相当于逐行拆分处理,导致每个元素生成一行记录。而直接用list(Col_2)会将整个分组的Col_2列作为单个向量存入列表列,满足嵌套向量的需求。
内容的提问来源于stack exchange,提问作者Fabio Correa
相关产品推荐
相关产品推荐

