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
我有一个脚本,我想重复 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