R中循环内的ifelse
我尝试使用ifelse通过循环将值分配给几个变量,但它为所有情况和变量提供了NAs 我有一个职业历史数据集(所有工作都有),其中每个工作编码为“q08dXX”,其中XX代表01到16之间的数字。每个作业都有一个起始年龄,存储在变量“q08paXX”中,其中XX表示12到70之间的数字。我想创建变量job12到job70,代表调查中所有受访者在给定年份的当前工作。在使用变量job12到job70创建了一个新的数据帧并将NAs分配给所有变量之后,我想根据“q08dXX”和“q08paXX”的值用实际值填充它们 我的代码如下所示: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”的值用实际
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="")])