gpt4 book ai didi

r - 使用 lapply 和 get 时的 data.table 列顺序

转载 作者:行者123 更新时间:2023-12-04 12:16:22 24 4
gpt4 key购买 nike

有人可以帮我理解为什么下面使用和不使用 get() 的两个版本的 lapply 操作不会产生相同的结果吗?使用 get() 时,结果列会混淆。

dt <- data.table(v1 = c(1,2), v2 = c(3,4), type = c('A', 'B'))

v1 v2 type
1: 1 3 A
2: 2 4 B

col_in <- c('v2', 'v1')
col_out <- paste0(col_in, '.new')

以硬编码的方式访问“类型”
dt[, (col_out) := lapply(.SD, function(x){x * min(x[type == 'A'])}), .SDcols = col_in]

产生预期的结果:
   v1 v2 type v2.new v1.new
1: 1 3 A 9 1
2: 2 4 B 12 2

但是,当通过 get() 访问“类型”时
dt[, (col_out) := lapply(.SD, function(x){x * min(x[get('type') == 'A'])}), .SDcols = col_in]
v1.new 的期望值在 v2.new反之亦然:
   v1 v2 type v2.new v1.new
1: 1 3 A 1 9
2: 2 4 B 2 12

注意:这是一个最小的玩具示例,我从尝试实现的更复杂的操作中提炼出来。 'type' 变量的名称作为输入参数给出。

最佳答案

有趣的!感谢分享!似乎使用 get 需要一些内部排序(错误?)。

避免这种情况的两种方法:

  • 将 type == 'A' 部分移到 dt[,lapply(...)] 之外
    referenceRows <- which(dt[,type == 'A'])
    referenceRows <- which(dt[,get('type') == 'A'])
    dt[, lapply(.SD, function(x){x * min(x[referenceRows])}), .SDcols = col_in]

    v1 v2 type v2.new v1.new
    1: 1 3 A 9 1
    2: 2 4 B 12 2
  • 首先创建新列,然后使用 setnames 确保为新列分配了正确的列名。最后用 cbind 将两部分绑定(bind)在一起:
    dtNew <- dt[, lapply(.SD, function(x){x * min(x[type == 'A'])}), .SDcols = col_in]
    setnames(dtNew, col_in, col_out)
    cbind(dt, dtNew)


    v1 v2 type v2.new v1.new
    1: 1 3 A 9 1
    2: 2 4 B 12 2

  • 相同的结果(尽管排序不同):
        dtNew <- dt[, lapply(.SD, function(x){x * min(x[get('type') == 'A'])}), .SDcols = col_in]
    setnames(dtNew, col_in, col_out)
    cbind(dt, dtNew)


    v1 v2 type v1.new v2.new
    1: 1 3 A 1 9
    2: 2 4 B 2 12

    关于r - 使用 lapply 和 get 时的 data.table 列顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50878299/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com