如何向具有特定特征的数据添加虚拟变量
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
,所以我们将向量与 &
进行向量与运算,移位,以产生您想要的输出
我的问题可能很基本,但我一直在努力解决这个问题,所以如果有人能提供解决方案,我将不胜感激。
我有以下格式的数据:
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
,所以我们将向量与&
进行向量与运算,移位,以产生您想要的输出