R data.table применяет функцию к строкам с использованием столбцов в качестве аргументов
У меня есть следующие data.table
x = structure(list(f1 = 1:3, f2 = 3:5), .Names = c("f1", "f2"), row.names = c(NA, -3L), class = c("data.table", "data.frame"))
Я хотел бы применить функцию к каждой строке data.table
. Функция func.test
использует args f1
и f2
и делает что-то с ней и возвращает вычисленное значение. Предположим (в качестве примера)
func.text <- function(arg1,arg2){ return(arg1 + exp(arg2))}
но моя реальная функция сложнее и делает циклы и все, но возвращает вычисленное значение. Какой был бы лучший способ сделать это?
- Создание бункеров из фрейма данных
- Разница: кнопка «Скомпилировать PDF» в RStudio vs. knit () и knit2pdf ()
- Как использовать греческие символы в ggplot2?
- Как настроить выходную ширину вывода RStudio Markdown (в HTML)
- Разделить фрейм данных на несколько выходных файлов
- Idiomatic R-код для разбиения вектора по индексу и выполнения операции над этим разделом
- Рабочий процесс для статистического анализа и составления отчетов
- избегайте строки, напечатанной на консоли, усеченной (в RStudio)
- Есть ли функция R, чтобы избежать строки для символов регулярных выражений
- Добавление незначительных меток на ось x в ggplot2 (без меток)
- Что случилось с моей функцией для загрузки нескольких CSV-файлов в единый dataframe в R с помощью rbind?
- Ошибка анализа JSON-файла с помощью пакета jsonlite
- Как читать параметры командной строки из R-скрипта?
Лучший способ – написать векторизованную функцию, но если вы этого не сделаете, возможно, это будет сделано:
x[, func.text(f1, f2), by = seq_len(nrow(x))]
Мы можем определить строки с .I
функцией.
dt_iris <- data.table(iris) dt_iris[, ..I := .I] ## Let's define some function some_fun <- function(dtX) { print('hello') return(dtX[, Sepal.Length / Sepal.Width]) } ## by row dt_iris[, some_fun(.SD), by = ..I] # or simply: dt_iris[, some_fun(.SD), by = .I] ## vectorized calculation some_fun(dt_iris)
Самый элегантный способ, который я нашел, – это mapply
:
x[, value := mapply(func.text, f1, f2)] x # f1 f2 value # 1: 1 3 21.08554 # 2: 2 4 56.59815 # 3: 3 5 151.4132