在lapply中跳过错误“未定义的列已选择”

时间:2019-10-15 07:59:36

标签: r lapply

考虑以下简单数据集ds

ds <- data.frame("x"=c(1,2,3), "y"=c(5,5,5))

我在ds的某些列上应用了一个函数,例如xy,并创建了两个名为xnewynew的新变量。效果很好:

ds[,c("xnew","ynew")] <- lapply(ds[,c("x","y")], function(x) x^2)

但是,假设还有一些未定义的列名,例如z!在这种情况下,我得到错误"undefined columns selected",并且没有创建xnewynew。 是否有任何方法可以跳过此错误并创建xnewynew并仅获得znew的错误? (类似于trycatch的{​​{1}})

for-loops

1 个答案:

答案 0 :(得分:2)

您可以将lapply参数列(oldvars)定义为ds(x,y)的列名与可能包含未定义列名(x,y,z)的向量之间的交集。为了便于记录,data.table包合并了一个优雅的内部lapply功能,对于大型数据集,该功能比base R更快。

代码

ds = data.table(ds)

oldvars = intersect(c('x', 'y', 'z'), colnames(ds))
newvars = paste0(oldvars, '_new')

ds[, (newvars) := lapply(.SD, function(x) x^2), .SDcols = oldvars]

最后一行将lapply语句应用于data.table子集(.SD),从而使用.SDcols参数(在本例中为x和y)声明子集列。

使用基数R代替data.table(来自OP注释):

ds[ ,newvars] <- lapply(ds[ ,oldvars], function(x) x^2)

结果:

> ds
   x y x_new y_new
1: 1 5     1    25
2: 2 5     4    25
3: 3 5     9    25