如何向具有特定特征的数据添加虚拟变量

How to add dummy variables to data with specific characteristic

我的问题可能很基本,但我一直在努力解决这个问题,所以如果有人能提供解决方案,我将不胜感激。

我有以下格式的数据:

ORG_NAME var_1_12 var_1_13 var_1_14
A 12 11 5
B 13 13 11
C 6 7 NA
D NA NA 5

我有超过 5 年的组织数据,但在那段时间里,一些组织合并了,另一些组织消失了。我计划进行固定效应回归,所以我需要添加一个虚拟变量,当组织保持不变时为“0”(在本例中为 A 行和 B 行),前一年为“1”合并,以及合并后。在这种情况下,我知道组织 C 和 D 合并了,所以我希望数据看起来像这样:

ORG_NAME var_1_12 dum_12 var_1_13 dum_13
A 12 0 5 0
B 13 0 11 0
C 6 1 NA 1
D NA 1 5 1

我该如何编码?

如果我理解得很好,你想用至少一个 NA 的“1”行进行编码。如果是这样,那么多年来您只需要一个虚拟变量,对吗?像这样

set.seed(4)
df <- data.frame(org=as.factor(LETTERS[1:5]),y1=sample(c(1:4,NA),5),y2=sample(c(3:6,NA),5),y3=sample(c(2:5,NA),5))
df$dummy <- as.numeric(apply(df, 1, function(x)any(is.na(x))))

哪个给你

org y1 y2 y3 dummy
1   A  3  5  3     0
2   B NA  4  5     1
3   C  4  3  2     0
4   D  1  6 NA     1
5   E  2 NA  4     1

 

这种方法(根据您的描述,任何方法都是如此)完全取决于公司是否在连续的行中。

mtx <- apply(is.na(dat[,-1]), MARGIN = 2,
             function(vec) zoo::rollapply(vec, 2, function(z) xor(z[1], z[2]), fill = FALSE))
mtx
#      var_1_12 var_1_13 var_1_14
# [1,]    FALSE    FALSE    FALSE
# [2,]    FALSE    FALSE     TRUE
# [3,]     TRUE     TRUE     TRUE
# [4,]    FALSE    FALSE    FALSE

out <- rowSums(mtx) == ncol(mtx)
out
# [1] FALSE FALSE  TRUE FALSE
out | c(FALSE, out[-length(out)])
# [1] FALSE FALSE  TRUE  TRUE

### and your 0/1 numbers, if logical isn't right for you
+(out | c(FALSE, out[-length(out)]))
# [1] 0 0 1 1

简要介绍:

  • is.na(dat[,-1]) returns 值(第一列除外)是否为NA的矩阵;因为它是一个矩阵,我们使用 apply 在每一列上调用一个函数(使用 MARGIN=2);

  • zoo::rollapply 是一次对向量的一部分 ("window") 进行滚动计算的函数,在本例中为 2 维。例如,如果我们有1:5,那么它首先查看c(1,2),然后是c(2,3),然后是c(3,4),等等

  • xor 是一个异或,这意味着当它的参数之一为真而另一个为假时,它将为真;

  • mtx是一个矩阵,表示一个cell及其下一个满足条件(一个是NA,一个不满足)。然后我们检查这些行中哪些行都是真的,形成 out.

  • 因为我们在两行中都需要一个 1,所以我们将向量与 & 进行向量与运算,移位,以产生您想要的输出