【发布时间】:2015-12-13 13:44:25
【问题描述】:
这似乎应该很容易,但我找不到答案:(。我正在尝试像这样规范化 data_table 的每一行:
normalize <- function(x) {
s = sum(x)
if (s>0) {
return(x/s)
} else {
return 0
}
}
如何在 data.table 的每一行上调用此函数并返回规范化的 data.table?我可以做一个 for 循环,但这肯定不是正确的方法,据我所知,apply(data, 1, normalize) 会将我的 data.table 转换为矩阵,这将对性能产生很大影响。
【问题讨论】:
-
另一种解读是:“在这里使用 data.table 而不是矩阵会带来很大的性能损失”(而不是认为
apply会带来它)。下面的最佳答案rowSums仍然会为您强制转换为矩阵。 -
@Frank Fair 点。我正在尝试在大量非常大的矩阵上执行此操作,并且在 data.table 中使用 fread() 比其他任何方法都快得多,所以我希望我可以留在 data.table 的“域”中并执行这很快。你是说我还不如转换成矩阵并运行上面的
apply命令,因为没有更快的方法来实现这一点? -
是的,我认为您不妨转换为矩阵并使用
rowSums和其他(无论出于何种原因)比相应的apply方法更快的函数。我可以想到rowMeans和col,但可能还有其他人。希望其他人在这方面不同意我的观点。 -
既然你排除了
s < 0的情况,我们可以认为x都是非负数吗?
标签: r performance data.table normalization