gpt4 book ai didi

r - 带有 na.rm=TRUE 参数的 data.table 和 pmin

转载 作者:行者123 更新时间:2023-12-04 11:21:35 25 4
gpt4 key购买 nike

我正在尝试使用 pmin 函数和 data.table(类似于帖子 row-by-row operations and updates in data.table )计算跨行的最小值,但使用类似 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。我试过将函数定义为
DT[, col_min := do.call(function(x) pmin(x,na.rm=TRUE),DT[,col_names,with=FALSE])]

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

有任何想法吗?

最佳答案

如果我们需要获取整个数据集每一行的最小值,使用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]

关于r - 带有 na.rm=TRUE 参数的 data.table 和 pmin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35778954/

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