ошибка пропуска "неопределенные столбцы выбраны" в lapply - PullRequest
1 голос
/ 15 октября 2019

Рассмотрим следующий простой набор данных ds:

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

Я применяю функцию к некоторым столбцам ds, таким как x и y, и создаю две новые переменные с именами xnew и * 1008. *. Это хорошо работает:

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

Но предположим, что есть некоторые неопределенные имена столбцов, такие как z! В этом случае я получаю ошибку "undefined columns selected", и ни xnew, ни ynew не были созданы. Есть ли способ пропустить эту ошибку и создать xnew и ynew и получить только ошибку для znew? (что-то вроде trycatch от for-loops)

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

    Error in `[.data.frame`(ds, , c("x", "y", "z")) : 
    undefined columns selected

1 Ответ

2 голосов
/ 15 октября 2019

Вы можете определить столбцы аргумента lapply (oldvars) как пересечение между именами столбцов ds (x, y) и вектором, который может содержать неопределенные имена столбцов (x, y, z). Напомним, что пакет data.table включает в себя элегантную внутреннюю функциональность lapply, которая будет быстрее, чем база 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
...