在R中使用从宽到长的重塑
我试图在R中将数据从宽改为长 我的宽格式数据如下所示: 我有以下数据矩阵: 行中有不同的公司,列中有不同年份的不同变量。(2012年收益、2011年收益、2010年收益、2012年总资产、2011年总资产等等 我想将其重新安排为一个较长的格式: 只有以下列:公司、年份、变量(收益、总资产等) 我已经试了好几天了。我也向他们寻求帮助,但我无法理解他们是如何改变数据的,以及如何分离年份的 提前感谢您的帮助 问候 格里蒂 PS:由于我对R不熟悉,而且在R中提供的帮助本身似乎是相当技术性的,我非常感谢您提供的任何简单介绍提示。这里有三个示例(以及一些我认为代表您描述的示例数据) 以下是示例数据:在R中使用从宽到长的重塑,r,reshape,R,Reshape,我试图在R中将数据从宽改为长 我的宽格式数据如下所示: 我有以下数据矩阵: 行中有不同的公司,列中有不同年份的不同变量。(2012年收益、2011年收益、2010年收益、2012年总资产、2011年总资产等等 我想将其重新安排为一个较长的格式: 只有以下列:公司、年份、变量(收益、总资产等) 我已经试了好几天了。我也向他们寻求帮助,但我无法理解他们是如何改变数据的,以及如何分离年份的 提前感谢您的帮助 问候 格里蒂 PS:由于我对R不熟悉,而且在R中提供的帮助本身似乎是相当技术性的,我非常感谢您
set.seed(1)
mydf <- data.frame(
company = LETTERS[1:4],
earnings_2012 = runif(4),
earnings_2011 = runif(4),
earnings_2010 = runif(4),
assets_2012 = runif(4),
assets_2011 = runif(4),
assets_2010 = runif(4)
)
mydf
# company earnings_2012 earnings_2011 earnings_2010 assets_2012 assets_2011 assets_2010
# 1 A 0.2655087 0.2016819 0.62911404 0.6870228 0.7176185 0.9347052
# 2 B 0.3721239 0.8983897 0.06178627 0.3841037 0.9919061 0.2121425
# 3 C 0.5728534 0.9446753 0.20597457 0.7698414 0.3800352 0.6516738
# 4 D 0.9082078 0.6607978 0.17655675 0.4976992 0.7774452 0.1255551
备选方案2:“重塑2”方案
它的语法非常流行。因为列名需要拆分才能获得这种“双宽”类型的数据,所以需要进行一点处理才能正常工作。它能够处理不平衡的数据,但如果不同的列属于不同的列类型(数字、字符、因子),它就不是最好的
请提供一个可复制的示例。阅读此示例了解更多信息:您可能还希望查看软件包
reformae2
,了解如何使用melt()
和dcast()
。您肯定需要至少添加您迄今为止尝试过的示例。您好,非常感谢您的帮助。我刚刚下载了您的软件包。我的数据中唯一不同的是,我没有公司的专栏,但是公司包含在行中。我的数据的名称。我是否必须添加另一个专栏才能使您满意你的函数工作吗?@Gritti,是的。你可以很容易地添加行名。类似于mydf$company的东西再次感谢你的帮助。它工作起来很有魅力。有没有一种简单的方法可以用这个软件包删除某些行?例如,如果我决定删除2012年发生的所有观察结果。@Gritti,只需重新修改即可详细信息,请参见help(Extract)
。再次感谢您的输入,我遇到了另一个问题,我正在尝试与以前基本相同的方法,但现在在company旁边有其他重复变量。我尝试将id.vars命令切换为id.vars=c(“company”,“扇区”),但我检索到以下错误:名称错误(x)
reshape(mydf, direction = "long", idvar="company",
varying = 2:ncol(mydf), sep = "_")
# company time earnings assets
# A.2012 A 2012 0.26550866 0.6870228
# B.2012 B 2012 0.37212390 0.3841037
# C.2012 C 2012 0.57285336 0.7698414
# D.2012 D 2012 0.90820779 0.4976992
# A.2011 A 2011 0.20168193 0.7176185
# B.2011 B 2011 0.89838968 0.9919061
# C.2011 C 2011 0.94467527 0.3800352
# D.2011 D 2011 0.66079779 0.7774452
# A.2010 A 2010 0.62911404 0.9347052
# B.2010 B 2010 0.06178627 0.2121425
# C.2010 C 2010 0.20597457 0.6516738
# D.2010 D 2010 0.17655675 0.1255551
library(reshape2)
dfL <- melt(mydf, id.vars="company")
dfL <- cbind(dfL, colsplit(dfL$variable, "_", c("var", "year")))
dcast(dfL, company + year ~ var, value.var="value")
# company year assets earnings
# 1 A 2010 0.9347052 0.62911404
# 2 A 2011 0.7176185 0.20168193
# 3 A 2012 0.6870228 0.26550866
# 4 B 2010 0.2121425 0.06178627
# 5 B 2011 0.9919061 0.89838968
# 6 B 2012 0.3841037 0.37212390
# 7 C 2010 0.6516738 0.20597457
# 8 C 2011 0.3800352 0.94467527
# 9 C 2012 0.7698414 0.57285336
# 10 D 2010 0.1255551 0.17655675
# 11 D 2011 0.7774452 0.66079779
# 12 D 2012 0.4976992 0.90820779
library(splitstackshape)
merged.stack(mydf, id.vars="company",
var.stubs=c("earnings", "assets"), sep = "_")
# company .time_1 earnings assets
# 1: A 2010 0.62911404 0.9347052
# 2: A 2011 0.20168193 0.7176185
# 3: A 2012 0.26550866 0.6870228
# 4: B 2010 0.06178627 0.2121425
# 5: B 2011 0.89838968 0.9919061
# 6: B 2012 0.37212390 0.3841037
# 7: C 2010 0.20597457 0.6516738
# 8: C 2011 0.94467527 0.3800352
# 9: C 2012 0.57285336 0.7698414
# 10: D 2010 0.17655675 0.1255551
# 11: D 2011 0.66079779 0.7774452
# 12: D 2012 0.90820779 0.4976992