在R中的循环内的ifelse

时间:2014-02-09 02:27:24

标签: r if-statement for-loop dataframe na

我尝试使用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吗?是否与范围有关,ifelse无法正确访问循环变量?

1 个答案:

答案 0 :(得分:1)

要测试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="")])

你应该没事。