【问题标题】:Can data.table handle identical column names when using .SDcols?使用 .SDcols 时,data.table 可以处理相同的列名吗?
【发布时间】:2013-11-17 15:56:32
【问题描述】:

当使用.SD 将函数应用于dt 的列的子集时,我似乎找不到正确的方法来处理列名重复的情况...例如

#  Make some data
set.seed(123)
dt <- data.table( matrix( sample(6,16,repl=T) , 4 ) )
setnames(dt , rep( letters[1:2] , 2 ) )
#   a b a b
#1: 2 6 4 5
#2: 5 1 3 4
#3: 3 4 6 1
#4: 6 6 3 6

#  Use .SDcols to multiply both column 'a' specifying them by numeric position
dt[ , lapply( .SD , `*`  , 2 ) , .SDcols = which( names(dt) %in% "a" ) ]
#    a  a
#1:  4  4
#2: 10 10
#3:  6  6
#4: 12 12

.SDcols 是列名的字符向量时,我无法使用它,所以我尝试了数字位置(which( names(dt) %in% "a" ) 给出了一个向量 [1] 1 3),但它似乎也只是乘以第一个 @987654330仅限@ 列。我做错了吗?

.SDcols 高级。指定 .SD 中包含的 x 列。可能是字符列名或数字位置。

这些也返回了与上面相同的结果...

dt[ , lapply( .SD ,function(x) x*2 ) , .SDcols = which( names(dt) %in% "a" ) ]
dt[ , lapply( .SD ,function(x) x*2 ) , .SDcols = c(1,3) ]

packageVersion("data.table")
#[1] ‘1.8.11’

【问题讨论】:

标签: r syntax data.table


【解决方案1】:

这个怎么样

dt[, "a"] * 2
##    a a.1
## 1  4   8
## 2 10   6
## 3  6  12
## 4 12   6

更详细的讨论

https://chat.stackoverflow.com/transcript/message/12783493#12783493

【讨论】:

  • 它并没有真正回答这个问题。我特别询问使用.SDcols,但谢谢。
  • @SimonO101 我认为这就是 .SD 和 .SDcols 的编码方式。最近 data.table 邮件列表上有关于这个的讨论
  • 即使使用列的数字位置?
  • 原来是做不到。为解决方法 +1。
【解决方案2】:

从 1.9.4 开始,这现在可以正常工作了。来自新闻:

data.tables 上的一致子集规则具有重复的列。简而言之,如果直接提供索引“j”或在.SDcols 中,则仅返回这些列(或者如果您提供-.SDcols!j,则删除这些列)。相反,如果给出了列名并且该列不止一次出现,那么很难决定在子集上保留哪个以及删除哪个。因此,要删除,该列的所有出现都将被删除,并且要保留,每次总是返回第一列。同时关闭#5688#5008。请注意,使用by= 对重复的列进行聚合可能仍无法给出预期的结果,因为它可能无法在正确的列上进行操作。

基本上,如果你这样做:

dt[, lapply(.SD, `*`, 2), .SDcols=c("a", "a")]
#     a  a
# 1:  4  4
# 2: 10 10
# 3:  6  6
# 4: 12 12

它仍然会产生意想不到的结果,因为很难分辨你每次提到哪个“a” - 所以总是选择第一个。

但是,如果您明确指定(就像您在 Q 中所做的那样):

dt[, lapply(.SD, `*`, 2), .SDcols=which( names(dt) %in% "a" )]
#     a  a
# 1:  4  8
# 2: 10  6
# 3:  6 12
# 4: 12  6

【讨论】:

    猜你喜欢
    • 2021-12-18
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多