[英]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.