【问题标题】:Creating a new variable by conditional recoding based on multiple variables in R基于R中的多个变量通过条件重新编码创建新变量
【发布时间】:2016-03-15 22:14:12
【问题描述】:

我有一个纵向数据集,其中包含每个受访者最多 59 个工作的信息。我对以下问题感兴趣:

REASON LEFT JOB IF NOT CURRENTLY WORKING JOB 01 2012
REASON LEFT JOB IF NOT CURRENTLY WORKING JOB 02 2012
.
.
.

每个都有 25 个不同的选择,其中我只对前三个感兴趣(1-裁员,2-公司关闭,3-临时工作结束)。我想将这 59 个变量重新编码为 1 个变量,因此如果有人因公司倒闭或裁员而失去工作(无论工作数量如何,我都想将其编码为 0,如果由于临时工作结束我想将其重新编码为 1。) 我会写:

Jobloss[Job1==1|Job1==2|Job2==1|Job2==2]<-0
Jobloss[Job1==3|Job2==3]<-1

如果我只有 2 个关于失业的变量,那就很容易了;但我有 59 个。 如果这些变量/列中的任何一个(c(1:59))==1 或 ==2,是否有一种简短的方法告诉 R 将新变量编码为 0。

我不仅需要用它来解决失业问题,还需要解决其他一些问题;所以这个命令可以为我节省很多时间。如果您能提供帮助,我将不胜感激。谢谢

【问题讨论】:

    标签: r if-statement conditional recode


    【解决方案1】:

    您可以对行使用 apply 来检查是否有任何列小于 3。有关示例,请参见下面的代码。

    df <- data.frame(Job1 = sample(1:3, 100, TRUE), 
                     Job2 = sample(1:3, 100, TRUE),
                     Job3 = sample(1:3, 100, TRUE))
    df$Jobloss <- as.numeric(apply(df, 1, function(z) any(z < 3)))
    
    df
    

    【讨论】:

      【解决方案2】:

      您可以编写一个函数来执行您要求的计算,通过将该函数应用于数据框的列来创建一个新的数据框,然后测量哪些行的列大于 0。下面,my_df应该是一个仅包含有关个人工作的 59 个变量的数据框。您还可以使用 apply 函数将其子集到那些变量。

      my_function <- function(my_var)
      {
          my_output <- rep(NA, length(my_var))
          my_output[my_var == 1 | my_var == 2] <- 0
          my_output[my_var == 3] <- 1
          return(my_output)
      }
      new_df <- apply(my_df, 2, my_function)
      my_df$Jobloss <- as.integer(rowSums(new_df, na.rm = TRUE) > 0)
      

      我假设您希望将 1、2 或 3 以外的任何值标记为 NA。如果不是这种情况,那么您将不得不调整函数中的第一行。

      【讨论】:

      • 哦,真的很抱歉,这会创建 0,而不是 my_var==3 以外的任何内容。相反,我希望其他所有内容都使用 NA。数据中已经有 NA,并且还有其他答案选择,例如 4、5 等。我希望 NA 用于除 1、2 或 3 以外的任何值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 2021-09-28
      • 2020-01-27
      • 2019-04-20
      相关资源
      最近更新 更多