1

我有一个纵向数据集,其中包含每个受访者最多 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

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

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

4

2 回答 2

0

您可以在行上使用 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
于 2016-03-15T22:25:15.000 回答
-1

您可以编写一个函数来执行您要求的计算,通过将该函数应用于数据框的列来创建一个新的数据框,然后测量哪些行的列大于 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。如果不是这种情况,那么您将不得不调整函数中的第一行。

于 2016-03-15T22:35:45.873 回答