如何在R中创建一个新变量,如果一个案例缺少一个值而另一个变量具有一个观察到的值,则返回1?

问题描述

我有两个变量,它们包含丢失的数据loonprofstat。为了更好地了解缺失的数据和需要进行插补的数据,我想在数据框中创建一个附加变量problem,如果1的每种情况下返回该变量loon丢失并且观察到profstat,否则观察到0。我生成了以下代码,仅将其作为输出x[] = 1。这个问题有解决办法吗?

 {
  problem <- dim(length(t))
  for (i in 1:nrow(dflapopofficial))
  {
    if (is.na(dflapopofficial$loon[i])==TRUE & is.na(dflapopofficial$profstat[i])==FALSE) {  
      dflapopofficial$problem[i]=1
    } else {
      dflapopofficial$problem[i]=0
    }
    return(problem)
  }

解决方法

有些地方可以改进:

  1. 请记住,R中的许多运算都是矢量化的。进行逻辑检查等时,您不需要遍历向量中的每个元素。
  2. is.na(some_condition) == TRUEis.na(some_condition)相同,而is.na(some_condition) == FALSE!is.na(some_condition)相同
  3. 如果您想在数据框中写入新列,并且要引用该数据框中的多个变量,则使用within可以节省很多输入时间-特别是在您的数据框名称很长的情况下
  4. 您将返回problem,但是在循环中,您正在写入dflapipofficial$problem,这是另一个变量。
  5. 如果要写1和0,则可以使用+(logical_vector)来将逻辑隐式转换为数字

将所有这些放在一起,您可以用单行替换整个循环:

within(dflapopofficial,problem <- +(is.na(loon) & !is.na(profstat)))

记住要保存结果,既可以存储回数据框,也可以存储到其副本,例如

df <- within(dflapopofficial,problem <- +(is.na(loon) & !is.na(profstat)))

因此,df只是dflapopofficial的一副,加上额外的列。