我有一个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)
为什么会这样?我该怎么办?
答案 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