我不想保留用于创建data.table子集的列。我该怎么做?

时间:2019-12-27 18:56:53

标签: r data.table

如果这是我的数据表:

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减掉吗?

2 个答案:

答案 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