将面板数据宽格式重塑为长格式 [英] Reshape Panel Data Wide Format to Long Format

查看:11
本文介绍了将面板数据宽格式重塑为长格式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在努力将Panel数据集从宽格式转换为长格式。数据集如下所示:

ID | KP1_430a | KP1_430b | KP1_430c | KP2_430a | KP2_430b | KP2_430c | KP1_1500a | ...  
1     ....
2     ....

kp1;kp2至kp7描述波。 A,b最多f来描述一个特定的物品。(例如甲方从左到右的位置)

我希望这些数据是长格式的。如下所示:

ID | Party | Wave | 430 | 1500  
 1     1       1     ..    ..
 1     2       1     ..    ..
 .     .       .          
 1     1       2     ..    ..
 .     .       .         
 2     1       1     ..    ..  

我尝试使用重塑功能。但随着时间的推移,我在重塑它方面遇到了问题,同时也在政党上遇到了问题。

这里有一个小数据。框架示例。

data <- data.frame(matrix(rnorm(10),2,10))  
data[,1] <- 1:2  
names(data) <- c("ID","KP1_430a" , "KP1_430b" , "KP1_430c" , "KP2_430a" , "KP2_430b ", "KP2_430c ", "KP1_1500a" ,"KP1_1500b", "KP1_1500c")

这就是我得到的结果。

  data_long <- reshape(data,varying=list(names(data)[2:4],names(data)[5:7], names(data[8:10]),  
                            v.names=c("KP1_430","KP2_430","KP1_1500"),  
                           direction="long", timevar="Party")

问题仍然是:如何也能获得长格式的时变变量?有没有一种更优雅的方式来重塑这些数据?在上面的代码中,我必须输入每个Wave和变量的名称(名称(Data)[2:4])。使用这个小的数据框可以,但是数据集要大得多。

编辑:如何手动完成此转换:我实际上已经完成了此操作,这给我留下了一个长达一页的代码文件。
首先,按列将KP1_430a和KP1_1500a与ID、Time=1和Party=1绑定。其次,为所有参与方创建相同的对象[b-f],分别更改参与方索引,并按行追加它。对其余的WAVE[2-7]执行第一步和第二步,分别更改Party和time变量,并逐行添加它们。

推荐答案

通常更容易分两个步骤进行:首先使用melt将数据转换为"Tall"格式(除非已经是这样),然后使用dcast将ti转换为更宽的格式。

library(reshape2)
library(stringr)

# Tall format
d <- melt(data, id.vars="ID")

# Process the column containing wave and party
d1 <- str_match_all( 
  as.character( d$variable ), 
  "KP([0-9])_([0-9]+)([a-z])" 
)
d1 <- do.call( rbind, d1 )
d1 <- d1[,-1]
colnames(d1) <- c("wave", "number", "party")
d1 <- as.data.frame( d1)
d <- cbind( d, d1 )

# Convert to the desired format
d <- dcast( d, ID + wave + party ~ number )

这篇关于将面板数据宽格式重塑为长格式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆