我正在分析一项纵向调查(https://microdata.worldbank.org/index.php/catalog/3712)约有2k个家庭参与(每轮都有所下降(。共有11个波/轮,每个波/轮根据问题的主题分为大约6-8个数据集。为了分析它,我需要它以适当的面板数据格式,每个主题都在一个文件中,组合所有的波浪。
请参阅excel片段(为了简单起见,删除了大多数列(:第1轮与第9轮(分类变量的级别有变化的名称,从全名到只有数字,但这是同一个问题(。基本上,格式看起来像这样:
head(round1.csv)
收入来源一次有太多问题,我将忽略权重(在合并解决后,这应该是一个单独的问题(。
如何合并?可以肯定的是,您将执行一项名为左联接的操作。最左边的数据集应该是最长的数据集(第一波(。其他的将由ID
连接,并且在下一个连接中丢失的ID
s将获得NA
s而不是值。我将在这里使用tidyverse
代码示例-left_join
文档`。
在路上你得处理一些事情。
- 重复列名
- 您可以使用类似
suffix = c(".wave1", ".wave2")
的suffix
参数
- 您可以使用类似
- 数据的不同编码(如
s7q1
1. YES
与1
(- 使用类似
extract()
的东西来获得相同的表示
- 使用类似
完成连接后,需要重新调整数据的形状。这将类似于pivot_longer()
,然后是extract()
,将.wave#
后缀放入一个单独的列中。然后,您可以将pivot_wider()
重新转换为更宽的格式,保留您的wave列。
类似R的伪代码,说明了如何做到这一点。。不起作用(因为我没有你的数据集(:
library(tidyverse)
library(readxl)
read_excel("wave1.xlsx") -> d_w1
read_excel("wave2.xlsx") -> d_w2
d_w1 %>%
extract(s7q1, into = "s7q1", regex = "([0-9]+)") %>%
d_w1fix
d_w1fix %>%
left_join(d_w2, by = "ID", suffix = c(".wave1", ".wave2")) %>%
pivot_longer(-ID, names_to = "question", values_to = "answer") %>%
extract(question, into = c("question", "wave"), regex = "([[:alnum:]]+).wave([0-9])") %>%
pivot_wider(names_from = "question", values_from = "answer") ->
d_final