【问题标题】:What's wrong with this for/if loop? (R)这个 for/if 循环有什么问题? (右)
【发布时间】:2015-05-30 18:25:25
【问题描述】:

有两列。 在新列中,我希望它随机添加或减去其他两列:

for (i in 1:nrow(data) {
  if (round(runif(1, 1,2),0) == 1) {
    data$p_p2= data$p[i] + data$p2[i]
} else {
  data$p_p2  = data$p[i] - data$p2[i]
}
}

例如,

  p  p1  p_p2 *goal*

  1  3   -2
  3  3   6
  5  2   7

谢谢

【问题讨论】:

  • 您可以使用ifelse 代替for 循环,即with(data, ifelse(round(runif(nrow(data),1,2),0)==1, p+p1, p-p1)) 在您的for 循环中,缺少一些括号,您可能需要[i]
  • 我认为这个版本可能适合你data$p_p2 <- NA;for (i in 1:nrow(data)) { if (round(runif(1, 1,2),0) == 1) { data$p_p2[i]= data$p[i] + data$p1[i] } else { data$p_p2[i] = data$p[i] - data$p1[i] } }

标签: r for-loop


【解决方案1】:

试试ifelse

 data$p_p2 <- with(data, ifelse(round(runif(nrow(data),1,2),0)==1,
                p+p1, p-p1))

或者修改你的代码

data$p_p2 <- NA
for (i in 1:nrow(data)) {
      if (round(runif(1, 1,2),0) == 1) {
        data$p_p2[i]= data$p[i] + data$p1[i] }
         else { 
        data$p_p2[i] = data$p[i] - data$p1[i]
    }
 }

数据

data <- structure(list(p = c(1, 3, 5), p1 = c(3, 3, 2), p_p2 = c(NA, 
 NA, NA)), .Names = c("p", "p1", "p_p2"), row.names = c(NA, -3L
 ), class = "data.frame")

【讨论】:

    【解决方案2】:

    对于此类问题,不需要 For 循环。将逻辑视为“新变量”是一种很好的做法,因为它往往会使事情更容易使用。

    set.seed(42) # for reproducibility
    dat <- as.data.frame( # dat because data is a command, don't overwrite it
        matrix(round(runif(100,1,10), nrow = 50, ncol = 2)) # example data
    )
    
    # Random response to question: Should be added? TRUE/FALSE
    dat$Test <- sample(c(TRUE,FALSE),50,replace = TRUE) 
    # IF TRUE, ADD, ELSE, SUBTRACT
    dat$Result <- ifelse(dat$Test, dat$V1 + dat$V2, dat$V1 - dat$V2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      相关资源
      最近更新 更多