在单行data.table中映射列表

时间:2017-06-11 19:20:05

标签: r data.table

我有一个data.table,其中有两列类型list,我希望成对组合。以下作品:

dt = data.table(a=as.list(1:2), b=as.list(3:4))
dt[, ab:= Map(c, a, b)]
> dt
#    a b  ab
# 1: 1 3 1,3
# 2: 2 4 2,4

...但只有一行时会失败:

dt = data.table(a=list(1), b=list(2))
dt[, ab:= Map(c, a, b)]

Error in `[.data.table`(dt, , `:=`(ab, Map(c, a, b))) : 
  (converted from warning) Supplied 2 items to be assigned to 1 items of 
column 'ab' (1 unused)

为什么会这样?我该怎么办?

1 个答案:

答案 0 :(得分:0)

我们需要用list

包装它
dt[, ab := list(Map(c, a, b))]

我们需要检查

的输出
str(dt[, Map(c, a, b)])
#Classes ‘data.table’ and 'data.frame':  2 obs. of  2 variables:
#$ V1: int  1 3
#$ V2: int  2 4

这是一个data.table,有2列,当我们分配到一个列,即'ab'时,每列都成为list元素。

但是,在单行data.table的情况下,

str(dt[, Map(c, a, b)])
#Classes ‘data.table’ and 'data.frame':  2 obs. of  1 variable:
#$ V1: num  1 2
#- attr(*, ".internal.selfref")=<externalptr> 

它没有发生,因为我们有一个包含2个元素的列,我们分配创建单个列'ab',而行数是1.这里,我们需要一个list包装器

str(dt[, list(Map(c, a, b))])
#Classes ‘data.table’ and 'data.frame':  1 obs. of  1 variable:
#$ V1:List of 1
# ..$ : num  1 2
#- attr(*, ".internal.selfref")=<externalptr> 

对于多行也是如此

str(dt[, list(Map(c, a, b))])
#Classes ‘data.table’ and 'data.frame':  2 obs. of  1 variable:
#$ V1:List of 2
#  ..$ : int  1 3
#  ..$ : int  2 4