R:重复脚本 n 次,在每次迭代中更改变量

R: Repeat script n times, changing variables in each iteration

我有一个脚本,我想重复 n 次,其中一些变量每次迭代更改 1。我正在创建一个数据框,其中包含各种向量之差的标准差。我的脚本目前看起来像这样:

standard.deviation <- data.frame
c(
 sd(diff(t1[,1])),
 sd(diff(t1[,2])),
 sd(diff(t1[,3])),
 sd(diff(t1[,4])),
 sd(diff(t1[,5]))
 ),
c(
  sd(diff(t2[,1])),
  sd(diff(t2[,2])),
  sd(diff(t2[,3])),
  sd(diff(t2[,4])),
  sd(diff(t2[,5]))
 ), 
c(
  sd(diff(t3[,1])),
  sd(diff(t3[,2])),
  sd(diff(t3[,3])),
  sd(diff(t3[,4])),
  sd(diff(t3[,5]))
 ),
)

我只想编写一次创建向量的脚本,然后重复 n 次(本例中为 n=3),这样我最终得到 n 个向量。在每次迭代中,我想将 1 添加到一个变量(在本例中:1 -> 2 -> 3,所以 't' 旁边的数字)。 t1、t2 和 t3 都是单独的数据帧,我不知道如何循环更改数据帧名称的脚本。

1) 如何做到这一点?

2) 我还想将一行中的每个 sd 值除以行号。我该怎么做?

3) 我将总共使用 140 个数据帧。有没有办法用一个简单的函数调用所有这些,而不是制作一个列表并单独添加 140 个数据帧中的每一个?

您可以遍历 ts 列表...

ans <- data.frame()
dats <- c(t, t1 , t2)
for (k in  dats){
     temp <- c()
     for (k2 in c(1,2,3,4,5)){
          temp <- c(temp , sd(k[,k2]))
     }
ans <- rbind(ans,temp)
}

rownames(ans) <- c("t1","t2","t3")
colnames(ans) <- c(1,2,3,4,5)
attr(results,"title") <- "standard deviation"

假设您总是想使用第 1 到第 5 列...

# some data 
t3 <- t2 <- t1 <- as.data.frame(matrix(rnorm(100),10,10))

# script itself
lis=list(t1,t2,t3)
sapply(lis,function(x) sapply(x[,1:5],function(y) sd(diff(y))))

#        [,1]     [,2]     [,3]
# V1 1.733599 1.733599 1.733599
# V2 1.577737 1.577737 1.577737
# V3 1.574130 1.574130 1.574130
# V4 1.158639 1.158639 1.158639
# V5 0.999489 0.999489 0.999489

输出是一个矩阵,所以 as.data.frame 应该解决这个问题。

为了完整性:正如@Tensibai 提到的,您可以只使用 list(mget(ls(pattern="^t[0-9]+$"))),假设您所有的变量都是 t 后跟一个数字。

编辑:感谢@Tensibai 指出缺失的步骤并改进了代码,以及 mget 步骤。

使用函数获得更易读的代码:

set.seed(123) # so you'll get the same number as this example
t1 <- t2 <- t3 <- data.frame(replicate(5,runif(10)))

# make a function for your sd of diff
sd.cols <- function(data) {
  # loop over the df columns
  sapply(data,function(x) sd(diff(x)))
}

# make a list of your data frames
dflist <- list(sdt1=t1,sdt2=t2,sdt3=t3)
# Loop overthe list
result <- data.frame(lapply(dflist,sd.cols))

给出:

> result
       sdt1      sdt2      sdt3
1 0.4887692 0.4887692 0.4887692
2 0.5140287 0.5140287 0.5140287
3 0.2137486 0.2137486 0.2137486
4 0.3856857 0.3856857 0.3856857
5 0.2548264 0.2548264 0.2548264