【问题标题】:data.table and pmin with na.rm=TRUE argument带有 na.rm=TRUE 参数的 data.table 和 pmin
【发布时间】:2016-06-17 04:17:53
【问题描述】:

我正在尝试使用 pmin 函数和 data.table(类似于帖子 row-by-row operations and updates in data.table)计算跨行的最小值,但使用类似 with=FALSE 语法的列字符列表和 @987654323 @参数。

DT <- data.table(x = c(1,1,2,3,4,1,9), 
                 y = c(2,4,1,2,5,6,6),
                 z = c(3,5,1,7,4,5,3),
                 a = c(1,3,NA,3,5,NA,2))

> DT
   x y z  a
1: 1 2 3  1
2: 1 4 5  3
3: 2 1 1 NA
4: 3 2 7  3
5: 4 5 4  5
6: 1 6 5 NA
7: 9 6 3  2

我可以直接使用列计算跨行的最小值:

DT[,min_val := pmin(x,y,z,a,na.rm=TRUE)]

给予

> DT
   x y z  a min_val
1: 1 2 3  1       1
2: 1 4 5  3       1
3: 2 1 1 NA       1
4: 3 2 7  3       2
5: 4 5 4  5       4
6: 1 6 5 NA       1
7: 9 6 3  2       2

但是,我试图在自动生成的大量列上执行此操作,并且我希望能够在存储在 col_names 变量 col_names &lt;- c("a","y","z') 中的任意列列表中执行此操作

我可以这样做:

DT[, col_min := do.call(pmin,DT[,col_names,with=FALSE])]

但它给了我 NA 值。我不知道如何将na.rm=TRUE 参数传递给do.call。我尝试将函数定义为

DT[, col_min := do.call(function(x) pmin(x,na.rm=TRUE),DT[,col_names,with=FALSE])]

但这给了我一个错误。我还尝试将参数作为列表中的附加元素传递,但我认为 pmin(或 do.call)在列名的 DT 非标准评估和参数之间感到困惑。

有什么想法吗?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    如果我们需要获取整个数据集每一行的最小值,请使用pmin,在.SD 上将na.rm=TRUE 连接为list.SDdo.call(pmin

    DT[, col_min:= do.call(pmin, c(.SD, list(na.rm=TRUE)))]
    DT
    #   x y z  a col_min
    #1: 1 2 3  1       1
    #2: 1 4 5  3       1
    #3: 2 1 1 NA       1
    #4: 3 2 7  3       2
    #5: 4 5 4  5       4
    #6: 1 6 5 NA       1
    #7: 9 6 3  2       2
    

    如果我们只想对存储在“col_names”中的列名子集执行此操作,请使用.SDcols

    DT[, col_min:= do.call(pmin, c(.SD, list(na.rm=TRUE))), 
                    .SDcols= col_names]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-18
      • 2017-05-22
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 2013-03-27
      • 2018-05-24
      相关资源
      最近更新 更多