我试图使用pmin函数和data.table计算跨行的最小值(类似于post. -row操作和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
Run Code Online (Sandbox Code Playgroud)
我可以直接使用列来计算行间的最小值:
DT[,min_val := pmin(x,y,z,a,na.rm=TRUE)]
Run Code Online (Sandbox Code Playgroud)
给
> 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
Run Code Online (Sandbox Code Playgroud)
但是,我试图在自动生成的大型列集上执行此操作,并且我希望能够跨这个任意列列表执行此操作,存储在col_names变量中, col_names <- c("a","y","z')
我可以做这个:
DT[, col_min := do.call(pmin,DT[,col_names,with=FALSE])]
Run Code Online (Sandbox Code Playgroud)
但它给了我NA值.我无法弄清楚如何将na.rm=TRUE参数传递给do.call.我已经尝试将函数定义为
DT[, col_min := do.call(function(x) pmin(x,na.rm=TRUE),DT[,col_names,with=FALSE])]
Run Code Online (Sandbox Code Playgroud)
但这给了我一个错误.我也尝试将参数作为列表中的附加元素传递,但我认为pmin(或do.call)在列的非DT标准评估和参数之间混淆.
有任何想法吗?
如果我们需要得到整个数据集的每一行的最低值,使用pmin,对.SD串联的na.rm=TRUE作为list与.SD对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
Run Code Online (Sandbox Code Playgroud)
如果我们只想对存储在'col_names'中的列名的子集执行此操作,请使用.SDcols.
DT[, col_min:= do.call(pmin, c(.SD, list(na.rm=TRUE))),
.SDcols= col_names]
Run Code Online (Sandbox Code Playgroud)