R中循环内的ifelse

R中循环内的ifelse,r,if-statement,for-loop,dataframe,na,R,If Statement,For Loop,Dataframe,Na,我尝试使用ifelse通过循环将值分配给几个变量,但它为所有情况和变量提供了NAs 我有一个职业历史数据集(所有工作都有),其中每个工作编码为“q08dXX”,其中XX代表01到16之间的数字。每个作业都有一个起始年龄,存储在变量“q08paXX”中,其中XX表示12到70之间的数字。我想创建变量job12到job70,代表调查中所有受访者在给定年份的当前工作。在使用变量job12到job70创建了一个新的数据帧并将NAs分配给所有变量之后,我想根据“q08dXX”和“q08paXX”的值用实际

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

我有一个职业历史数据集(所有工作都有),其中每个工作编码为“q08dXX”,其中XX代表01到16之间的数字。每个作业都有一个起始年龄,存储在变量“q08paXX”中,其中XX表示12到70之间的数字。我想创建变量job12到job70,代表调查中所有受访者在给定年份的当前工作。在使用变量job12到job70创建了一个新的数据帧并将NAs分配给所有变量之后,我想根据“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
  }
}
for(拼写为c(“01”、“02”、“03”、“04”、“05”),
"06","07","08","09","10","11","12",
"13","14","15","16")
){ 
年龄(12:70){

newdata[,粘贴(“job”,age,sep=”“)]要测试
NA
,您需要使用
is.NA
功能。请参见:

> 1 != NA    # bad
[1] NA

> !is.na(1)  # good
[1] TRUE
因此,最后,只需替换:

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


你应该没问题。

什么是
newdata
olddata
以及
olddata[,粘贴(“q08pa”,spell,sep=”“)]
的输出是什么,当你在循环外运行时,有任何
拼写
值?返回值的形状是否与
olddata[,粘贴(“q08pa”,spell,sep=“”)==age&olddata[,粘贴(“q08pa”)相同,spell,sep=“”)!=NA
?例如,通过更改logicalsolddata是一个Spss数据集,通过从外部包中读取.Spss()读入R。新数据是另一个数据帧,具有与旧数据相同的行数和顺序(它是该数据集ID变量的副本),其中我将变量job12添加到job70,所有变量均包含NAs。
olddata[,粘贴(“q08pa”,拼写,sep=”“)的输出
在循环外部使用数值时似乎没有问题:is是一个与数据帧长度相同的数字向量。@rawr循环每个阶段中ifelse的返回值是相同的形状:一个与逻辑向量长度相同的数字向量,用于
olddata[,paste(“q08pa”,spell,sep=”“])==age&!is.na(olddata[,paste(“q08pa”,拼写,sep=“”)])
(注意,我修复了NAs的测试)。
!is.na(olddata[,paste("q08pa",spell,sep="")])