【问题标题】:ifelse within loop in R在R中的循环内ifelse
【发布时间】: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 无法正确访问循环变量有关?

【问题讨论】:

  • 什么是newdataolddata,当您在循环外运行时,olddata[,paste("q08pa",spell,sep="")] 的输出是什么?任何spell 值?
  • 返回值和olddata[,paste("q08pa",spell,sep="")]==age &amp; olddata[,paste("q08pa",spell,sep="")]!=NA的形状一样吗?
  • 例如,通过更改逻辑来玩弄ifelse(TRUE &amp; 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 &amp; !is.na(olddata[,paste("q08pa",spell,sep="")]) 的逻辑向量长度相同的数字向量(请注意,我修复了 NAs 的测试)。

标签: r if-statement for-loop dataframe na


【解决方案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="")])

你应该没事的。

【讨论】:

    猜你喜欢
    • 2021-03-29
    • 2018-11-11
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多