JMisc's addCol
, кажется, добавляет единственное значение (документация вводит в заблуждение его как «константу») в data.frame для всего столбца.В вашем коде вы заменяете существующий столбец после первой итерации новым значением.
Решение в вашем случае состоит в том, чтобы избежать цикла for
- фактически, data.frames практически никогда не должны создаватьсявнутри петли.Вместо этого используйте векторизованные операции R.Например:
sqrt_or_null = function (x) {
tryCatch(sqrt(x), error = function (e) "NULL")
}
p = mutate(x, sqr = lapply(k1, sqrt_or_null))
Однако это оставит вас со столбцом списка, который является громоздким типом данных в data.frame.Причина в том, что данный столбец не из списка может содержать только значения одного типа, но ваша функция возвращает различных типов в зависимости от того, успешно ли выполнена операция: numeric
или character
.
Вы можете привести результаты:
p = mutate(x, sqr = as.character(lapply(k1, sqrt_or_null)))
… но я предлагаю подумать о лучшем представлении ошибочных значений (таких как NA
) или о том, чтобы избежать сбоев перед выполнением этой операции (например,на filter
(неверные строки).
Ваш код имеет дополнительную проблему: k1
имеет тип factor
, а не numeric
.Таким образом, он потерпит неудачу для каждого значения.Сначала вам нужно будет преобразовать значения коэффициентов в числовые значения, что требует двух шагов: преобразование в символьные строки, а затем в числовые значения:
p = x %>%
mutate(k1num = as.numeric(as.character(k1))) %>%
mutate(sqr = ifelse(is.na(k1num), "NULL", sqrt(k1num)))