【发布时间】:2014-02-09 02:27:23
【问题描述】:
我尝试使用 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 是保存作业类型和作业开始时间的数据框,new data 是我要在其中创建 jobXX 变量的新数据框。不知何故,在运行此代码后,我得到了一个充满 NA 的数据框。这里有什么问题?是ifelse吗?是否与范围和 ifelse 无法正确访问循环变量有关?
【问题讨论】:
-
什么是
newdata和olddata,当您在循环外运行时,olddata[,paste("q08pa",spell,sep="")]的输出是什么?任何spell值? -
返回值和
olddata[,paste("q08pa",spell,sep="")]==age & olddata[,paste("q08pa",spell,sep="")]!=NA的形状一样吗? -
例如,通过更改逻辑来玩弄
ifelse(TRUE & TRUE, rnorm(10), round(rnorm(10))) -
olddata 是一个 Spss 数据集,通过外部包中的 read.spss() 读入 R。 newdata 是另一个与 olddata 具有相同行数和相同顺序的数据帧(它是该数据集的 ID 变量的副本),其中我将变量 job12 添加到 job70 都包含 NA。当我在循环外使用数值时,
olddata[,paste("q08pa",spell,sep="")]的输出似乎没问题:is 是一个与数据框长度相同的数值向量。 -
@rawr 循环每个阶段中 ifelse 的返回值是相同的形状:与
olddata[,paste("q08pa",spell,sep="")]==age & !is.na(olddata[,paste("q08pa",spell,sep="")])的逻辑向量长度相同的数字向量(请注意,我修复了 NAs 的测试)。
标签: r if-statement for-loop dataframe na