#r
Вопрос:
Я хочу создать цикл for, который способен обрабатывать несколько условий и сохранять результат в именованной матрице mat
. для этой цели у меня есть именованный фрейм данных df
и последовательность чисел, которые я использую в качестве weight
именованных w
.
wlt;- seq(.01,.1, .009) matlt;- matrix(0,11,10) dflt;- data.frame(year=c( 2000:2010), ph= c(12:22), ph_fit=c(14,15,18,16,20,15,17,23,11,19,26) ,b= c(-2,-1,3,-1.5,-4,5,5.5,-6,3.5,2.1,-5.4))
то, что я хочу, — это моделирование b
для каждого года на основе ценности w
использования этих условий:
если ph_fit gt; ph, новая оценка gt; b (b_fit)
будет b_fit= b* 1 (w)
(где b lt;0 ) и b_fit=b* 1-w
(где b gt;0).
для следующего условия у меня есть:
если ph_fit lt; ph, новая оценка b (b_fit)
будет b_fit= b* 1 w
(где b gt; 0 ) и gt; b_fit=b* 1-w
(где b это итеративный процесс, который повторяется для каждого значения в w
.
по приведенному ниже коду я попытался, но получил некоторую ошибку:
for (i in 1: 11) { if (df$ph_fit gt; df$ph amp; df$b lt; 0) { mat[, i] = df$b * 1 w } else if (df$b gt; 0) { mat[, i] = df$b * 1 - w } else if (df$ph_fit lt; df$ph amp; df$b lt; 0) { mat[, i] = df$b * 1 - w } else if (df$b gt; 0) { mat[, i] = df$b * 1 w } }
мой ожидаемый результат b_fit
будет таким:
`2000` `2001` `2002` `2003` `2004` `2005` `2006` `2007` `2008` `2009` `2010` lt;chrgt; lt;dblgt; lt;dblgt; lt;dblgt; lt;dblgt; lt;dblgt; lt;dblgt; lt;dblgt; lt;dblgt; lt;dblgt; lt;dblgt; lt;dblgt; 1 w1 -2.02 -1.01 2.97 -1.52 -4.04 5.05 5.56 -6.06 3.46 2.12 -5.45 2 w2 -2.04 -1.02 2.94 -1.53 -4.08 5.10 5.60 -6.11 3.43 2.14 -5.50 3 w3 -2.06 -1.03 2.92 -1.54 -4.11 5.14 5.65 -6.17 3.40 2.16 -5.55 4 w4 -2.07 -1.04 2.89 -1.56 -4.15 5.18 5.70 -6.22 3.37 2.18 -5.60 5 w5 -2.09 -1.05 2.86 -1.57 -4.18 5.23 5.75 -6.28 3.34 2.20 -5.65 6 w6 -2.11 -1.06 2.84 -1.58 -4.22 5.28 5.80 -6.33 3.31 2.22 -5.70 7 w7 -2.13 -1.06 2.81 -1.60 -4.26 5.32 5.85 -6.38 3.28 2.23 -5.75 8 w8 -2.15 -1.07 2.78 -1.61 -4.29 5.36 5.90 -6.44 3.24 2.25 -5.79 9 w9 -2.16 -1.08 2.75 -1.62 -4.33 5.41 5.95 -6.49 3.21 2.27 -5.84 10 w10 -2.18 -1.09 2.73 -1.64 -4.36 5.46 6.00 -6.55 3.18 2.29 -5.89 11 w11 -2.2 -1.1 2.7 -1.65 -4.4 5.5 6.05 -6.6 3.15 2.31 -5.94
Ответ №1:
Я считаю, что основная проблема с вашим циклом заключается в том, что вы на каждой итерации используете все «df», что означает, что ваши операторы «если» имеют несколько выходов. т. Е. для первого оператора «если» первой итерации
«df$ph_fit gt; df$ph amp; df$b gt;
Поэтому вам нужно подмножество ваших данных внутри цикла, пример ниже ниже. Кроме того, имейте в виду размеры вашей матрицы, которая заканчивается 11×11 (а не 11×10).
wlt;- seq(.01,.1, .009) matlt;- matrix(0,11,11) dflt;- data.frame(year=c( 2000:2010), ph= c(12:22), ph_fit=c(14,15,18,16,20,15,17,23,11,19,26) ,b= c(-2,-1,3,-1.5,-4,5,5.5,-6,3.5,2.1,-5.4)) for (i in 1:11){ data lt;- df[i, ] if(data$ph_fit gt; data$ph amp; data$b lt; 0) { mat[,i] = data$b * 1 w} else if (data$b gt; 0 ) {mat[,i] = data$b * 1-w} else if( data$ph_fit lt; data$ph amp; data$b lt; 0) {mat[,i]= data$b * 1-w} else if (data$b gt; 0) {mat[,i] = data$b * 1 w} }
Комментарии:
1. спасибо, Йост, но почему вывод вашего кода отличается от моего?
2. Привет, я тоже задавался этим вопросом, я думаю, что для получения ваших результатов не хватает некоторых скобок, таких как «данные$b * (1 w)».