循环返回比预期更多的值和 NA
Loop returning more values than expected and NA's
我正在尝试模拟一些数据以估计样本量,但我的循环返回了意外结果。
我正在尝试从具有不同数量样本大小的生成值向量中对 a 进行采样,然后连接多个模拟的均值和标准差。
library(MCMCglmm)
library(tidyverse)
Est <- function(n, mean, sd, lower, upper, samp_min, samp_max, samp_int, nsim){
Data <- round(rtnorm(n, mean, sd, lower, upper), digits = 0) # Create a vector to sample from
Samp_size <- seq(samp_min, samp_max, samp_int) # Create vector of sample sizes
# Set up enpty results data frames
Results_samp <- data.frame()
Results <- data.frame()
for(i in 1:nsim){ ## Loop through number of simulations
for (j in seq_along(Samp_size)) { # Loop through sample sizes
Score <- sample(Data, j, replace = TRUE)
Nsubj <- Samp_size[j]
Mean <- mean(Score, na.rm = TRUE)
SD <- sd(Score, na.rm = TRUE)
Results_samp <- rbind(Results_samp,
data.frame(
Nsubj,
Mean,
SD))
}
Results <- rbind(Results, Results_samp)
}
Results
}
Test <- Est(n = 1000, mean = 55, sd = 37, lower = 0, upper = 100,
samp_min = 5, samp_max = 20, samp_int = 5, nsim = 5)
这将创建一个包含 60 行的数据框,我希望其中有 20 行(4 种样本大小的 5 次模拟),而对于 5 的样本大小,我总是会返回 NA。
谁能看出我错在哪里?
谢谢!
一般来说,用 rbind
动态增长 data.frame
是 非常 在 R 中做事的低效方式。几乎总是 better/faster 做你想做的事情的方法。
除此之外,就回答您的问题而言,让我们看一下嵌套 for
循环的简化版本
x1 <- data.frame()
x2 <- data.frame()
for (i in 1:5) {
for (j in 1:4) x1 <- rbind(x1, data.frame(x1 = i, x2 = i^2))
x2 <- rbind(x2, x1)
}
看看 x2
如何有 60 行?
原因是您从未重置 x1
。如果我们解决这个问题
x1 <- data.frame()
x2 <- data.frame()
for (i in 1:5) {
for (j in 1:4) x1 <- rbind(x1, data.frame(x1 = i, x2 = i^2))
x2 <- rbind(x2, x1)
x1 <- data.frame()
}
正如预期的那样,我们有 nrow(x2) = 20
。
我正在尝试模拟一些数据以估计样本量,但我的循环返回了意外结果。
我正在尝试从具有不同数量样本大小的生成值向量中对 a 进行采样,然后连接多个模拟的均值和标准差。
library(MCMCglmm)
library(tidyverse)
Est <- function(n, mean, sd, lower, upper, samp_min, samp_max, samp_int, nsim){
Data <- round(rtnorm(n, mean, sd, lower, upper), digits = 0) # Create a vector to sample from
Samp_size <- seq(samp_min, samp_max, samp_int) # Create vector of sample sizes
# Set up enpty results data frames
Results_samp <- data.frame()
Results <- data.frame()
for(i in 1:nsim){ ## Loop through number of simulations
for (j in seq_along(Samp_size)) { # Loop through sample sizes
Score <- sample(Data, j, replace = TRUE)
Nsubj <- Samp_size[j]
Mean <- mean(Score, na.rm = TRUE)
SD <- sd(Score, na.rm = TRUE)
Results_samp <- rbind(Results_samp,
data.frame(
Nsubj,
Mean,
SD))
}
Results <- rbind(Results, Results_samp)
}
Results
}
Test <- Est(n = 1000, mean = 55, sd = 37, lower = 0, upper = 100,
samp_min = 5, samp_max = 20, samp_int = 5, nsim = 5)
这将创建一个包含 60 行的数据框,我希望其中有 20 行(4 种样本大小的 5 次模拟),而对于 5 的样本大小,我总是会返回 NA。
谁能看出我错在哪里?
谢谢!
一般来说,用 rbind
动态增长 data.frame
是 非常 在 R 中做事的低效方式。几乎总是 better/faster 做你想做的事情的方法。
除此之外,就回答您的问题而言,让我们看一下嵌套 for
循环的简化版本
x1 <- data.frame()
x2 <- data.frame()
for (i in 1:5) {
for (j in 1:4) x1 <- rbind(x1, data.frame(x1 = i, x2 = i^2))
x2 <- rbind(x2, x1)
}
看看 x2
如何有 60 行?
原因是您从未重置 x1
。如果我们解决这个问题
x1 <- data.frame()
x2 <- data.frame()
for (i in 1:5) {
for (j in 1:4) x1 <- rbind(x1, data.frame(x1 = i, x2 = i^2))
x2 <- rbind(x2, x1)
x1 <- data.frame()
}
正如预期的那样,我们有 nrow(x2) = 20
。