Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将函数应用于R数据帧中的每个值_R - Fatal编程技术网

将函数应用于R数据帧中的每个值

将函数应用于R数据帧中的每个值,r,R,我有一个58列的数据帧,我需要将$log(x_{I,j}+1)$转换应用于前56列中的所有值。我可以用什么方法来最有效地进行这项工作?我假设有某种东西可以让我这样做,而不仅仅是使用一些for循环来运行整个数据帧 您应该能够只引用所需的列并执行操作,即: df.log[,1:56] <- log(df[,1:56]+1) df.log[,1:56]alexwhan的答案对于log来说是正确的(并且应该被选为正确的答案)。然而,由于日志是矢量化的,所以它工作得非常干净。我经常经历非矢量化函数

我有一个58列的数据帧,我需要将$log(x_{I,j}+1)$转换应用于前56列中的所有值。我可以用什么方法来最有效地进行这项工作?我假设有某种东西可以让我这样做,而不仅仅是使用一些for循环来运行整个数据帧

您应该能够只引用所需的列并执行操作,即:

df.log[,1:56] <- log(df[,1:56]+1)

df.log[,1:56]alexwhan的答案对于log来说是正确的(并且应该被选为正确的答案)。然而,由于日志是矢量化的,所以它工作得非常干净。我经常经历非矢量化函数的特殊痛苦。当我从R开始时,不太了解apply家族,我经常使用丑陋的循环。因此,对于那些可能无意中发现这个问题但没有矢量化函数的人,我提供以下概念证明

#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)}))) 
#创建示例数据

df或
df[,1:56]注意,尽管它对您的特定示例不起作用,但有时您可以通过
Vectorize
函数来绕过未被矢量化的函数。尽管如果您对其进行双重矢量化,例如矢量化(Vectorize(logplusone,“x”),“x”)。。。然而,我发现向量化函数有点难以理解,所以我更喜欢答案中给出的解决方案,因为我(回到代码中)更容易理解它是如何工作的。真的吗?我发现矢量化代码比sapply代码更容易阅读。对于您的示例代码,解析您的实际操作需要做更多的工作-“好的,所以我们要重叠数据帧的列…好的,然后我们要在每个列上使用sapply并找到logplus1值。”与“我们要找到数据帧中所有观察值的logplus1值”相比(这就是我读取矢量化代码的方式)啊,对不起,我不清楚。矢量化的代码当然更容易阅读。使用矢量化函数进行矢量化的代码是我发现很难处理的。要了解其中的情况,我必须回到原始的函数声明,因为我不太适应在特定环境中挖掘矢量化函数使…而使用矢量化调整的函数的暴露部分并不能使我清楚地知道原始函数是什么。