如果这是我的数据表:
DT = data.table(x=rep(c("a","b","c"),each=2), y=c(1,3), v=1:6)
setkey(DT, y)
DT
# x y v
# 1: a 1 1
# 2: b 1 3
# 3: c 1 5
# 4: a 3 2
# 5: b 3 4
# 6: c 3 6
现在我从该数据表创建子集;变量y包含在结果中。有没有办法删除它?
DT1 <- DT[ , .SD[ , paste(x, v, sep="", collapse="_")], by=y]
DT1
# y V1
# 1: 1 a1_b3_c5
# 2: 3 a2_b4_c6
我知道可以通过以下附加步骤来做到这一点:
DT1 <- DT1[,y:=NULL]
..但想知道在创建子集时是否可以将y减掉吗?
答案 0 :(得分:3)
使用split.data.table和magrittr:
library(magrittr)
split(DT, by="y", keep.by=FALSE) %>%
sapply(. %$% paste(x, v, sep="", collapse="_"))
# 1 3
# "a1_b3_c5" "a2_b4_c6"
如果不需要名称(上面的1和3),可以在unname
之后添加 sapply
。
要与@akrun的答案进行比较,请参阅?split.data.table
,其中解释了使用by=
而不是f=
的方法。如果keep.by=
参数为available in DT[...]
,则可以更直接地解决OP的问题。
答案 1 :(得分:2)
我们可以做一个split
DT[, .(V1 = unlist(lapply(split(.SD[, .(x, v)], y),
function(x) do.call(paste, c(x, sep="", collapse="_")))))]
# V1
#1: a1_b3_c5
#2: a2_b4_c6
或者无需创建新对象,因为可以在创建另一个对象之前链接分配(:=
)步骤
DT[ , paste(x, v, sep="", collapse="_"), by=y][, y := NULL][]
#. V1
#1: a1_b3_c5
#2: a2_b4_c6