将面板数据宽格式重塑为长格式

lst*_*tze 5 r reshape

我正在努力将Panel数据集从宽格式转换为长格式.数据集看起来像这样:

ID | KP1_430a | KP1_430b | KP1_430c | KP2_430a | KP2_430b | KP2_430c | KP1_1500a | ...  
1     ....
2     ....
Run Code Online (Sandbox Code Playgroud)

KP1; KP2直到KP7描述了波浪.a,b到f描述特定的项目.(例如,甲方从左到右的位置)

我想以长格式提供这些数据.像这样:

ID | Party | Wave | 430 | 1500  
 1     1       1     ..    ..
 1     2       1     ..    ..
 .     .       .          
 1     1       2     ..    ..
 .     .       .         
 2     1       1     ..    ..  
Run Code Online (Sandbox Code Playgroud)

我试着使用重塑功能.但是,随着时间的推移和同时对各方进行重塑,我遇到了问题.

这是一个小的data.frame示例.

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")
Run Code Online (Sandbox Code Playgroud)

这就是我走了多远.

  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")
Run Code Online (Sandbox Code Playgroud)

问题仍然存在:如何以长格式获取时变变量?是否有更优雅的方式来重塑这些数据?在上面的代码中,我必须输入每个wave和变量的名称(名称(数据)[2:4]).有了这个小的data.frame就可以,但数据集要大得多.

编辑:如何手动完成这个转换:我实际上已经完成了这个,这留下了一个页面长的代码文件.
首先,绑定KP1_430a和KP1_1500a,ID为ID,Time = 1,Party = 1列.其次为所有各方[bf]创建相同的对象,分别更改派对索引,并逐行追加.对其余的波[2-7]执行第一步和第二步,分别更改party和time var,并按顺序追加它们.

Vin*_*ynd 4

通常分两步进行会更容易:首先使用melt将数据转换为“高”格式(除非已经是这种情况),然后使用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 )
Run Code Online (Sandbox Code Playgroud)