【问题标题】:if else inside for loopif else 在 for 循环中
【发布时间】:2019-12-04 02:52:11
【问题描述】:

我看到这篇关于 for 循环中的 ifelse 语句的帖子:

How to create new variables using loop and ifelse statement

var1 <- c(0,0,1,2)
var2 <- c(2,2,2,0)
var3 <- c(0,0,0,2)
var4 <- c(1,2,2,2)

df<-as.data.frame(cbind(var1,var2,var3,var4))
df

 var1 var2 var3 var4 
   0    2    0    1   
   0    2    0    2   
   1    2    0    2   
   2    0    2    2   

根据帖子,输出将是:

  var1 var2 var3 var4 new
   0    2    0    1   1
   0    2    0    2   0
   1    2    0    2   1
   2    0    2    2   0

因为如果在一行中的任何元素中有 1,则该列中的相应行(新)将为 1,否则将为 0

我是这样写的:

for (i in 1:nrow(df)){
  if(mean(df[i,] == 1) == 0){
    df$new[i]<- 0}
  else{
    df$new[i]<- 1    
  }}

但是,它给出了这个输出:

var1 var2 var3 var4 new
 0    2    0    1   1
 0    2    0    2   1
 1    2    0    2   1
 2    0    2    2   1

如果我将代码 if(mean(df[i,] == 1) == 0) 修改为 if(mean(df[i] == 1) == 0) 那么它可以工作,但在其他情况下,如果我通过在某个位置包含 1 来修改数据框,那么 if(mean(df[i,] == 1) == 0) 是正确的,而不是 if(mean(df[i] == 1) == 0 )。

谁能解释这种行为?以及如何将我的循环修改为始终正确? 任何解释都非常感谢!

【问题讨论】:

  • 似乎什么也没做,还是一样

标签: r for-loop if-statement


【解决方案1】:

矢量化解决方案总是更好:

df$new <- as.integer(rowSums(df == 1) > 0)

至于您的代码,我认为它有效。很可能在您进行测试时,您的数据框中仍有df$new,这导致逻辑混乱。我无法重现错误。

var1 <- c(0,0,1,2)
var2 <- c(2,2,2,0)
var3 <- c(0,0,0,2)
var4 <- c(1,2,2,2)

df<-as.data.frame(cbind(var1,var2,var3,var4))

df2 <- df
df2
  var1 var2 var3 var4
1    0    2    0    1
2    0    2    0    2
3    1    2    0    2
4    2    0    2    2

df2$new <- as.integer(rowSums(df == 1) > 0)
for (i in 1:nrow(df)){
  if(mean(df[i,] == 1) == 0){
    df2$new[i]<- 0}
  else{
    df2$new[i]<- 1    
  }}

df2

  var1 var2 var3 var4 new
1    0    2    0    1   1
2    0    2    0    2   0
3    1    2    0    2   1
4    2    0    2    2   0

【讨论】:

  • hmm..我觉得你说的很对,我一直重启R并清空环境,现在好像没问题,其实我的印象是代码应该更正吧?...谢谢!
【解决方案2】:

根据提供的数据

var1 <- c(0,0,1,2)
var2 <- c(2,2,2,0)
var3 <- c(0,0,0,2)
var4 <- c(1,2,2,2)

df<-as.data.frame(cbind(var1,var2,var3,var4))

get_1 <- apply(df, 1, function(x) any(x %in% c(1)))

vec = c()

for (i in get_1){ 
    if(i == 'TRUE'){
        vec <- c(vec, 1)
    }
    else if(i == 'FALSE'){
        vec <- c(vec, 0)
    }
}

df$new <- vec
df

#OUTPUT

#    var1 var2 var3 var4 new
#     0   2    0    1     1
#     0   2    0    2     0
#     1   2    0    2     1
#     2   0    2    2     0

【讨论】:

  • 谢谢你,是的,你的解决方案还可以,但我也在寻找解释为什么我的循环不能按照我的预期工作......如何循环每行的每个元素?
猜你喜欢
  • 2017-08-02
  • 2012-11-13
  • 1970-01-01
  • 2021-09-16
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多