【问题标题】:Reshape Panel Data Wide Format to Long Format将面板数据宽格式重塑为长格式
【发布时间】:2012-02-18 17:40:43
【问题描述】:

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

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

KP1; KP2 到 KP7 描述了 Waves。 a,b 到 f 描述一个特定的项目。 (例如甲方从左到右放置)

我想要长格式的数据。像这样:

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

我尝试使用重塑功能。但随着时间的推移,我在重新塑造它时遇到了问题,同时又在派对上出现了问题。

这是一个小的 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")

这就是我所取得的成就。

  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")

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

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

【问题讨论】:

  • 如果您想在长格式中为 430 和 1500 单独列,那么在宽格式中应该有来自这些条件的相同数量的数据。按照您的方式,您将在 1500 列中有很多 NA……还是您想要这样?
  • 哦,这可能有点粗略。这两个变量有相同数量的波 (1-7) 和派对项目 (a-f)。所以:KP[1-7]_430[a-f],KP[1-7]_1500[a-f]。
  • 然而,对于数据集中的一些变量,(a) 只有一些波的数据——例如KP[146]_1640[a-f] 或 (b) 不是特定于当事人的 - 例如KP[1-7]_1490.

标签: r reshape


【解决方案1】:

分两步进行通常更容易:首先使用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 )

【讨论】:

    【解决方案2】:

    目前,您的 Wave 数据在您的变量名称中,您需要通过一些字符串处理来提取它。我没有融化的麻烦

    mdat <- melt(data, id.vars="ID")
    mdat$wave=sub("KP", "", sub("_.+$", "", mdat$variable)) # remove the other stuff
    mdat
    

    您的描述太粗略(到目前为止),我无法弄清楚派生“派对”变量的规则,所以也许您可以编辑您的问题以展示人类如何完成......和然后我们可以向计算机展示如何做到这一点。

    编辑:如果原始列名中的最后一个小写字母是文森特认为的派对,那么您可以修剪这些名称中的尾随空格并提取:

    mdat$var <- sub("\\s", "", (as.character(mdat$variable)))
    mdat$party=substr( mdat$var, nchar(mdat$var), nchar(mdat$var))
    #--------------
    > mdat
       ID  variable      value wave party       var
    1   1  KP1_430a  0.7220627    1     a  KP1_430a
    2   2  KP1_430a  0.9585243    1     a  KP1_430a
    3   1  KP1_430b -1.2954671    1     b  KP1_430b
    4   2  KP1_430b  0.3393617    1     b  KP1_430b
    5   1  KP1_430c -1.1477627    1     c  KP1_430c
    6   2  KP1_430c -1.0909179    1     c  KP1_430c
    <snipped output>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      • 2021-05-01
      • 2021-09-15
      • 2022-01-11
      相关资源
      最近更新 更多