【发布时间】:2019-01-23 12:23:21
【问题描述】:
我在 R 中将循环与 if else 和 next 结合起来。
为了重现我的问题的复杂性,我不能提供最小的示例,而是提供一大段代码。目的是在rmse_1 和rmse_2 列中用min、max、50percentile 填充列表df。
您需要在# !!! change path标记的位置根据您想要的路径更改路径。如果您更改了路径,您可以运行代码:
# create lists
mse_samp <- list("mse_A" = list("P10" = data.frame(number = seq(1,3,1),
mse_1 = c(2.5, 4.6, 7.8),
mse_2 = c(6.7, 8.9, 4.1)),
"P30" = data.frame(number = seq(1,3,1),
mse_1 = c(22.5, 74.6, 97.8),
mse_2 = c(56.7, 78.9, 14.1))),
"mse_B" = list("P10" = data.frame(number = seq(1,3,1),
mse_1 = c(122.5, 124.6, 127.8),
mse_2 = c(126.7, 128.9, 124.1)),
"P30" = data.frame(number = seq(1,3,1),
mse_1 = c(3422.5, 3474.6, 3497.8),
mse_2 = c(3456.7, 3478.9, 3414.1))))
# !!! change path
save(mse_samp,
file="H:\\R\\Forum_data\\dat1.RData")
mse_samp <- list("mse_A" = list("P70" = data.frame(number = seq(1,3,1),
mse_1 = c(22.2, 77.6, 97.8, 21.2, 73.9),
mse_2 = c(26.7, 78.9, 17.1, 23.2, 82.2)),
"P80" = data.frame(number = seq(1,3,1),
mse_1 = c(1022.2, 3077.6, 9097.8, 1221.2, 7373.9),
mse_2 = c(7626.7, 2278.9, 7317.1, 7623.2, 8982.2))),
"mse_B" = list("P70" = data.frame(number = seq(1,3,1),
mse_1 = c(3722.2, 3777.6, 3797.8),
mse_2 = c(3726.7, 3778.9, 3717.1)),
"P80" = data.frame(number = seq(1,3,1),
mse_1 = c(1022.2, 3077.6, 9097.8),
mse_2 = c(7626.7, 2278.9, 7317.1))))
save(mse_samp,
file="H:\\R\\Forum_data\\dat2.RData")
# create table for min max for different perc and runs for each paramter (loop)
n_measure <- 3 # number of different measures
npr1 <- 2 # number of different percs run1
npr2 <- 2 # number of different percs run2
targets <- c("A", "B")
for (i in 1:length(targets)) {
df <- data.frame(run = c(rep("run1", n_measure * npr1),
rep("run2", n_measure * npr2)),
perc_train = c(rep(c(0.1, 0.3), times = 1, each = n_measure), # percs run 1
rep(c(0.7, 0.8), times = 1, each = n_measure)), # percs run 2
measure = c(rep(c("min", "max", "50percentile"),
times = npr1 + npr2, each = 1)),
rmse_1 = rep(NA, n_measure * (npr1 + npr2)),
rmse_2 = rep(NA, n_measure * (npr1 + npr2))
)
assign(paste0('df_', targets[i]), df)
}
df <- list("A" = df_A, "B" = df_B)
# convert column which are factors to characters
for (i in 1:length(targets)) {
df[[i]][sapply(df[[i]], is.factor)] <- lapply(df[[i]][sapply(df[[i]], is.factor)],
as.character)
}
rm(list = c("df_A", "df_B", "df_C"))
# !!! change path
path <- c("H:\\R\\Forum_data\\dat1.RData", # run1
# !!! change path
"H:\\R\\Forum_data\\dat2.RData") # run2
percs_names <- c("P10", "P30", "P70", "P80")
percs <- c(0.1, 0.3, 0.7, 0.8)
targets <- c("A", "B")
run_name <- c("run1", "run2")
measure_name <- c("min", "max", "50percentile")
fill_names <- c("rmse_min_1", "rmse_min_2", "rmse_max_1", "rmse_max_2",
"percentile_50_1", "percentile_50_2")
var_name <- c("rmse_1", "rmse_2")
a_or_b <- c("a","b")
# read in data
for (i in 1:length(path)) {
load(path[i])
dat <- mse_samp
for (j in 1:length(targets)) {
for (k in 1:length(percs_names)) {
# if statement
if(percs_names[k] == names(dat[[j]][k])){
dat1 <- dat[[paste0("mse_", targets[j])]][k][[1]]
rmse_min_1 <- sqrt(min(dat1$mse_1))
rmse_min_2 <- sqrt(min(dat1$mse_2))
rmse_max_1 <- sqrt(max(dat1$mse_1))
rmse_max_2 <- sqrt(max(dat1$mse_2))
percentile_50_1 <- quantile(sqrt(dat1$mse_1), probs = 0.5)
percentile_50_2 <- quantile(sqrt(dat1$mse_2), probs = 0.5)
for (fi in 1:length(fill_names)) {
for (m in 1:length(measure_name)) {
a <- which(df[[targets[j]]]$run == run_name[i] &
df[[targets[j]]]$measure == measure_name[m] &
df[[targets[j]]]$perc_train == percs[k] &
is.na(df[[targets[j]]]$rmse_1)
)
b <- which(df[[targets[j]]]$run == run_name[i] &
df[[targets[j]]]$measure == measure_name[m] &
df[[targets[j]]]$perc_train == percs[k] &
is.na(df[[targets[j]]]$rmse_2)
)
for (v in 1:length(var_name)) {
df[[targets[j]]][eval(parse(text = a_or_b[v])), which(names(df[[targets[j]]]) == var_name[v])] <- eval(parse(text = fill_names[fi]))
}
}
}
}
else { next }
}
}
}
1.问题 运行代码后出现如下错误信息:
Error in if (percs_names[k] == names(dat[[j]][k])) { :
missing value where TRUE/FALSE needed
我猜这个错误可能是由if elsestatement 引起的。如何运行代码而不报错?
2。问题 目前只填充run1 的行。 rmse_1 和 rmse_2 在行中填充相同的值 min、max、50percentile。他们应该是不同的。如何填充其他运行并正确填充行?最后应该没有NA了。
【问题讨论】:
-
“我不能提供一个最小的例子,但可以提供一大段代码” 肯定有一些方法可以将其缩小到其本质。例如,您是否需要这么多列表项,每个列表项都有这么多数据框,才能说明问题?通读所有这些并知道发生了什么真的很困难。此外,我认为很多人不愿意运行需要将输出保存到磁盘的代码。
-
如果您的问题只是 if 语句中的简单真/假比较,您可以找到一种方法来设置类似的东西,用更少的细节隔离问题
-
如果我不这样发布,那么人们可以尝试使用 lappy 或类似的东西,但我想使用 for 循环。我发布了最少的示例,但人们提出了我无法用于解决我的问题的简单解决方案……我认为标记路径会更容易,因为人们会发现插入路径更快。我不知道问题是否仅由 if 语句引起。也许它在别的地方。这就是为什么我要发布这么大的代码。
-
在调试中,一步一步来。这可能意味着您针对一个问题发布一个问题,修复它,然后找到另一个要修复的问题。没关系。这个 specific 问题看起来只是根据嵌套列表的名称检查向量中的值。找出一个不需要 197 行代码的示例,编辑问题并强调您只需要基于循环的解决方案
-
尝试将问题简化为本质是提高自己技能的另一种方法,同时尝试解决问题。此外,您还可以让 stackoverflow 中的其他人更轻松地为您提供帮助。我根据自己的经验告诉你这一点(有时你会为自己迄今为止所做的努力感到不知所措,所以现在简单地看起来很困难,但相信我,这是值得的!)
标签: r for-loop if-statement nested-loops next