将循环替换为"apply"系列的一个功能

Nic*_*cso 9 loops r apply

我在列表中有data.frames,通常,当我想要居中数据时,我使用循环(如下例所示).我想使用"apply"系列的一些功能,但我无法弄清楚如何编写代码.

我的数据的一个例子:

env <- list (data.frame(a=c(-1.08, -1.07, -1.07),
                        b=c( 4.61,  4.59,  4.59),
                        c=c( 3.46,  3.56,  3.52)),
             data.frame(a=c( 3.93,  3.94,  3.92),
                        b=c(-6.69, -6.72, -6.68),
                        c=c( 3.04,  3.08,  3.03)))
Run Code Online (Sandbox Code Playgroud)

我将使用这些值来使它们居中:

d <- c(a=10.20, b=-10.91, c=11.89)
Run Code Online (Sandbox Code Playgroud)

我经常使用的循环类型:

for(i in 1:length(env)) {
    env[[i]][, 1] <- env[[i]][, 1] - d[1]
    env[[i]][, 2] <- env[[i]][, 2] - d[2]
    env[[i]][, 3] <- env[[i]][, 3] - d[3]
}
Run Code Online (Sandbox Code Playgroud)

有没有办法使用"apply"系列的函数来完成我在上面循环中所做的同样的事情?

PoG*_*bas 8

这里有两点可以简化:循环遍历列表元素并d单独减去每个值.

要替换for循环,您可以使用lapply("l",因为我们在列表上进行迭代).

# Run function for every element i in list env
lapply(env, function(i))
Run Code Online (Sandbox Code Playgroud)

要简化减法,您可以:

  1. 转置数据帧 t(i)
  2. 执行减法 t(i) - d
  3. 将其转换回来 t(t(i) - d)

所以最终的代码是:

lapply(env, function(i) t(t(i) - d))
Run Code Online (Sandbox Code Playgroud)