data.table和pmin中的na.rm=TRUE参数

10

我正在尝试使用pmin函数和data.table计算行间的最小值(类似于post中的逐行操作和更新数据表),但使用字符列列表(类似于with=FALSE语法)和na.rm=TRUE参数。

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 <- c("a","y","z')

我可以这样做:

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

但是它给我返回NA值。我不知道如何将na.rm=TRUE参数传递到do.call中。我尝试过将函数定义为:

但它给我NA值。我无法弄清楚如何在do.call中传递na.rm=TRUE参数。我已经尝试将函数定义为

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

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

有什么想法吗?

1个回答

14
如果我们需要获取整个数据集每一行的最小值,使用pmin函数,在.SD上将na.rm=TRUE.SD组合成一个list,用于do.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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接