繁体   English   中英

R循环中的ifelse

[英]ifelse within loop in R

我尝试使用ifelse通过循环将值分配给多个变量,但是它为所有情况和变量提供了NA。

我有一个职业历史数据集(一个职业所有的职业),其中每个职业都被编码为“ q08dXX”,XX代表从01到16的数字。每个职业都有一个起始年龄,存储在变量“ q08paXX”中,其中XX代表从12到70的数字。我想创建变量job12到job70,代表给定年份所有调查受访者的当前职位。 在使用变量job12到job70创建了一个新的数据框并为它们分配了NA之后,我想使用基于“ q08dXX”和“ q08paXX”的​​值的实际值填充它们。

我的代码如下所示:

for (spell in c("01","02","03","04","05",
                "06","07","08","09","10","11","12",
                "13","14","15","16")
){ 
  for (age in 12:70){
      newdata[,paste("job",age, sep="")] <- ifelse(
      olddata[,paste("q08pa",spell,sep="")]==age &
        olddata[,paste("q08pa",spell,sep="")]!=NA, # check if new spell started and if starting time not missing
      olddata[,paste("q08d",spell,sep="")], # assign value of new spell if it started
      newdata[,paste("job",age, sep="")]) # keep existing value if new spell didn't start
  }
}

在这里,olddata是保存作业类型和作业开始年龄的数据框,而新数据是我要在其中创建jobXX变量的新数据框。 以某种方式,运行此代码后,我得到一个充满NA的数据帧。 这里有什么问题? 是ifelse吗? 是否与作用域有关,并且是否无法正确访问循环变量?

要测试NA ,您需要使用is.na函数。 看到:

> 1 != NA    # bad
[1] NA

> !is.na(1)  # good
[1] TRUE

所以最后,只需替换:

olddata[,paste("q08pa",spell,sep="")]!=NA

!is.na(olddata[,paste("q08pa",spell,sep="")])

你应该没事的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM