我尝试使用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无法正确访问循环变量?
答案 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="")])
你应该没事。