考虑以下简单数据集ds
:
ds <- data.frame("x"=c(1,2,3), "y"=c(5,5,5))
我在ds的某些列上应用了一个函数,例如x
和y
,并创建了两个名为xnew
和ynew
的新变量。效果很好:
ds[,c("xnew","ynew")] <- lapply(ds[,c("x","y")], function(x) x^2)
但是,假设还有一些未定义的列名,例如z
!在这种情况下,我得到错误"undefined columns selected"
,并且没有创建xnew
或ynew
。
是否有任何方法可以跳过此错误并创建xnew
和ynew
并仅获得znew
的错误? (类似于trycatch
的{{1}})
for-loops
答案 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