Подтвердить что ты не робот

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))}

но моя реальная функция более сложна и делает циклы и все, но возвращает вычисленное значение. Какой был бы лучший способ сделать это?

4b9b3361

Ответ 1

Лучший способ - написать векторизованную функцию, но если вы не можете, то, возможно, это подойдет:

x[, func.text(f1, f2), by = seq_len(nrow(x))]

Ответ 2

Самый элегантный способ, который я нашел, с 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

Или с пакетом purrr:

x[, value := purrr::pmap(.(f1, f2), func.text)]

Ответ 3

Мы можем определить строки с помощью функции .I.

dt_iris <- data.table(iris)
dt_iris[, ..I := .I]

## Let 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)