我有一个58列数据框,我需要将转换$ log(x_ {i,j} +1)$应用于前56列中的所有值。我可以用什么方法最有效地解决这个问题?我假设有一些东西可以让我这样做而不只是使用一些for循环来运行整个数据帧。
答案 0 :(得分:33)
alexwhan的答案适合日志(并且应该被选为正确的答案)。但是,它的工作原理非常干净,因为日志是矢量化的。我经常经历非矢量化函数的特殊痛苦。当我开始使用R,并且不熟悉应用系列时,我经常使用丑陋的循环。因此,对于那些可能偶然发现这个没有矢量化函数的人而言,我提供了以下概念证明。
#Creating sample data
df <- as.data.frame(matrix(runif(56 * 56), 56, 56))
#Writing an ugly non-vectorized function
logplusone <- function(x) {log(x[1] + 1)}
#example code that achieves the desired result, despite the lack of a vectorized function
df[, 1:56] <- as.data.frame(lapply(df[, 1:56], FUN = function(x) {sapply(x, FUN = logplusone)}))
#Proof that the results are the same using both methods...
#Note: I used all.equal rather than all so that the values are tested using machine tolerance for mathematical equivalence. This is probably a non-issue for the current example, but might be relevant with some other testing functions.
#should evaluate to true
all.equal(log(df[, 1:56] + 1),as.data.frame(lapply(df[, 1:56], FUN = function(x) {sapply(x, FUN = logplusone)})))
答案 1 :(得分:21)
您应该只能引用所需的列,然后执行操作,即:
df.log[,1:56] <- log(df[,1:56]+1)