【问题标题】:How to add dummy variables to data with specific characteristic如何将虚拟变量添加到具有特定特征的数据中
【发布时间】:2021-04-29 12:33:13
【问题描述】:

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

我有以下格式的数据:

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 年的组织数据,但在那段时间里,一些组织合并了,而另一些则消失了。我正计划进行固定效应回归,所以我需要添加一个虚拟变量,当组织保持不变时(在本例中为 A 行和 B 行),虚拟变量为“0”,前一年为“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

我将如何编码?

【问题讨论】:

  • 您的第一个表中有什么迹象表明CD 即将合并已经合并var_1_12var_1_13 这两个名字似乎没有立即用处。
  • 大多数组织都是按地理位置命名的,所以我知道在 90% 的情况下,字母顺序接近(并且名称相似)的组织已经合并。 Var_1_12 表示年份和那一年的价值(在这种情况下,我正在衡量财务回报)。这能回答你的问题吗?
  • 没有。与C 关联的属性有3 个:6、7 和NA。与D 相关的三个属性:Na、NA 和 5。仅使用这些数据,您怎么知道C 已经或即将合并?是不是C的NA在D有数据的那一列,反之亦然?
  • 为什么var_1_14 的值 pverwrote var_1_13var_1_13 中之前的值会发生什么变化?
  • 是的!我知道 C 和 D 会合并,因为 C 有 D 没有的数据,反之亦然

标签: r panel-data


【解决方案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]) 返回值(第一列除外)是否为NA 的矩阵;因为是矩阵,所以我们使用apply对每一列调用一个函数(使用MARGIN=2);

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

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

  • mtx是一个矩阵,表示一个单元格和它下面的一个单元格满足条件(一个是NA,另一个不是)。然后我们检查这些行中的哪一行都是真的,形成out

  • 由于我们在两行中都需要一个 1,因此我们将 &amp; 与自身进行向量与运算,移位,以产生您想要的输出

【讨论】:

  • 非常感谢,特别感谢您分解解决方案 - 我想学习并变得更好,而不仅仅是复制和粘贴解决方案。我现在就试试这个!
【解决方案2】:

如果我理解得很好,您想用至少一个 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

 

【讨论】:

  • 嗨!感谢您提供解决方案,我想保留尽可能多的数据,这就是为什么我只想在 NA 之前和之后的年份分配 1 (所以我希望可以解释非合并年份)。那有意义吗?如果不可能,我一定会按照你的建议做,谢谢!
猜你喜欢
  • 2020-02-02
  • 2015-02-01
  • 1970-01-01
  • 2019-09-26
  • 2018-06-20
  • 2021-07-20
  • 2017-02-26
  • 2022-06-14
  • 1970-01-01
相关资源
最近更新 更多