次の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
は、引数f1
およびf2
を使用し、それを使用して計算値を返します。想定(例として)
func.text <- function(arg1,arg2){ return(arg1 + exp(arg2))}
しかし、私の実際の関数はより複雑で、ループとすべてを行いますが、計算された値を返します。これを達成する最良の方法は何でしょうか?
最良の方法は、ベクトル化された関数を書くことですが、できなければ、おそらく次のようになります。
x[, func.text(f1, f2), by = seq_len(nrow(x))]
私が見つけた最もエレガントな方法は、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)]
.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)