R - 对循环的不同部分执行两次计算

时间:2017-07-28 21:10:33

标签: r

好的,所以我写了一个循环,打算循环的第一部分,执行乘法计算,乘以两列。然后,对于循环的剩余部分,循环将使用与第一个不同的列执行另一个乘法。

多重放映的列是:ocret和clret,它们与响应相乘。

我的代码:

train.set$output[[1]] = if (train.set$response[[1]] == 1) {
  apply(train.set[,c('ocret', 'response')], 1, function(x) { (x[1]*x[2])} )
}

for (i in 2:nrow(train.set)){
  train.set$output[i] = if(train.set$response[i] == 1) {
    apply(train.set[,c('clret', 'response')], 1, function(x) { (x[1]*x[2])}) 
    train.set$output[i-1]
  }
}

这个想法首先找到一个响应== 1,它是执行ocret *响应计算。

对于循环的第二部分,它是从第2行开始,以便不覆盖第一部分......并继续循环+1并执行clret *响应计算。

逻辑对我来说很有意义,这几乎是我第一次尝试循环。当我运行代码时,没有任何反应,它没有输出列,任何人都可以给我任何指针吗?我继续阅读它,这是有道理的,不知道我缺少什么,任何解释非常感谢。

下面的示例数据框架和输出:

       ocret            clret    response  output
1   0.00730616      0.003382433     0       0
2   -0.084899894    -0.088067766    0       0
3   0.047208568     0.054174679     1   0.047208568
4   -0.002671414    -0.004543992    0       0
5   -0.039943462    -0.040290793    0       0
6   -0.01428499     -0.013506524    0       0
7   -0.037054965    -0.038517845    0       0
8   -0.058027611    -0.057394837    1   -0.058027611
9   -0.004014491    -0.011332705    1   -0.011332705
10  -0.079419682    -0.076167096    1   -0.076167096
11  -0.003424577    -0.011759287    1   -0.011759287
12  0.099260455     0.115800375     1   0.115800375
13  -0.011841897    -0.005322141    1   -0.005322141
14  -0.087230999    -0.090349775    1   -0.090349775
15  0.040570359      0.042507445    1   0.042507445
16  -0.001846555    -0.006212821    1   -0.006212821
17  0.044398056      0.047684898    1   0.047684898
18  -0.025856823    -0.030799705    0       0
19  -0.057677505    -0.061012471    0       0
20  0.010043567     0.012634046     0       0
21  -0.020609404    -0.034511205    0       0

第3行:ocret *回复

第8行:ocret *回复

9到16行:clret * response

1 个答案:

答案 0 :(得分:1)

可能不需要For循环。我们可以使用dplyrdata.table来获得所需的输出(dt2)。

library(dplyr)
library(data.table)

dt2 <- dt %>%
  mutate(RunID = rleid(response)) %>%
  group_by(RunID) %>%
  mutate(output = ifelse(response == 0, 0,
                         ifelse(row_number() == 1, ocret, clret))) %>%
  ungroup() %>%
  select(-RunID)

数据准备

dt <- read.table(text = "       ocret            clret    response
1   0.00730616      0.003382433     0
                 2   -0.084899894    -0.088067766    0 
                 3   0.047208568     0.054174679     1
                 4   -0.002671414    -0.004543992    0
                 5   -0.039943462    -0.040290793    0 
                 6   -0.01428499     -0.013506524    0
                 7   -0.037054965    -0.038517845    0
                 8   -0.058027611    -0.057394837    1
                 9   -0.004014491    -0.011332705    1
                 10  -0.079419682    -0.076167096    1
                 11  -0.003424577    -0.011759287    1
                 12  0.099260455     0.115800375     1
                 13  -0.011841897    -0.005322141    1
                 14  -0.087230999    -0.090349775    1
                 15  0.040570359      0.042507445    1
                 16  -0.001846555    -0.006212821    1
                 17  0.044398056      0.047684898    1
                 18  -0.025856823    -0.030799705    0
                 19  -0.057677505    -0.061012471    0
                 20  0.010043567     0.012634046     0
                 21  -0.020609404    -0.034511205    0",
                 header = TRUE, stringsAsFactors = FALSE)