使用字符后缀而不是数字后缀来重塑从宽到长 [英] reshape wide to long with character suffixes instead of numeric suffixes

查看:9
本文介绍了使用字符后缀而不是数字后缀来重塑从宽到长的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

受来自@GSK3的a comment关于重塑数据的问题的启发,我开始对变量名使用字符后缀而不是数字后缀的数据重塑进行了一些实验。

作为示例,我将从UCLA ATS Stata learning webpages加载dadmomw数据集(请参见网页上的"示例4")。

数据集如下所示:

library(foreign)
dadmom <- read.dta("https://stats.idre.ucla.edu/stat/stata/modules/dadmomw.dat")
dadmom
#   famid named  incd namem  incm
# 1     1  Bill 30000  Bess 15000
# 2     2   Art 22000   Amy 18000
# 3     3  Paul 25000   Pat 50000

尝试从宽格式重塑为长格式时,我遇到了一个问题。以下是我为重塑数据所做的工作。

reshape(dadmom, direction="long", idvar=1, varying=2:5, 
        sep="", v.names=c("name", "inc"), timevar="dadmom",
        times=c("d", "m"))
#     famid dadmom  name  inc
# 1.d     1      d 30000 Bill
# 2.d     2      d 22000  Art
# 3.d     3      d 25000 Paul
# 1.m     1      m 15000 Bess
# 2.m     2      m 18000  Amy
# 3.m     3      m 50000  Pat

请注意,将列名交换为"name"和"Inc";将v.names更改为c("inc", "name")并不能解决问题。

reshape对于希望以相当标准的方式命名列似乎非常挑剔。例如,如果我首先重命名列,我可以正确地(并且容易地)重塑数据:

dadmom2 <- dadmom # Just so we can continue experimenting with the original data
# Change the names of the last four variables to include a "."
names(dadmom2)[2:5] <- gsub("(d$|m$)", "\.\1", names(dadmom2)[2:5])
reshape(dadmom2, direction="long", idvar=1, varying=2:5, 
        timevar="dadmom")
#     famid dadmom name   inc
# 1.d     1      d Bill 30000
# 2.d     2      d  Art 22000
# 3.d     3      d Paul 25000
# 1.m     1      m Bess 15000
# 2.m     2      m  Amy 18000
# 3.m     3      m  Pat 50000

我的问题是:

  1. 为什么R要交换我提供的示例中的列?
  2. 我是否可以在重塑之前不更改变量名的情况下使用基Rreshape获得此结果?
  3. 是否有其他方法可以考虑替代reshape

推荐答案

此操作(指定不同的列与谁匹配):

reshape(dadmom, direction="long",  varying=list(c(2, 4), c(3, 5)), 
        sep="", v.names=c("name", "inc"), timevar="dadmom",
        times=c("d", "m"))

所以您实际上在这里嵌套了重复的度量;对于妈妈和爸爸,既有名字,也有Inc。因为您有多个重复的度量值系列,所以您必须将list提供给变量,以告知reshape哪个组堆叠在另一个组上。

因此,解决此问题的两种方法是像我一样提供列表,或者像您一样以R beast喜欢的方式重命名列。

查看我最近在BASE上的博客reshape了解有关这方面的更多信息(特别是第二个链接涉及这一点):

reshape (part I)

reshape (part II)

这篇关于使用字符后缀而不是数字后缀来重塑从宽到长的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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