使用recast()将复杂数据集从长格式转换为宽格式

6

我正在处理一个来自lme4的数据集,并尝试学习如何应用reshape2将其从长格式转换为宽格式[完整代码在帖子末尾]。

library(lme4)
data("VerbAgg")  # load the dataset

该数据集有9个变量:'Anger','Gender'和'id'不随'item'变化,而'resp'、'btype'、'situ'、'mode'和'r2'会随之变化。

我已经成功地使用reshape()函数将数据集从长格式转换为宽格式:

wide <- reshape(VerbAgg, timevar=c("item"), 
             idvar=c("id", 'Gender', 'Anger'), dir="wide")

这个数据集包含了316个观测值和123个变量,看起来已经正确转换。然而,我尝试使用reshape/reshape2重现宽数据框却没有成功。

wide2 <- recast(VerbAgg, id + Gender + Anger ~ item + variable)
Using Gender, item, resp, id, btype, situ, mode, r2 as id variables
Error: Casting formula contains variables not found in molten data: Anger

我可能不是很清楚recast如何定义id变量,但我非常困惑为什么它看不到"Anger"。同样地,

wide3 <- recast(VerbAgg, id + Gender + Anger ~ item + variable, 
               id.var = c("id", "Gender", "Anger"))
Error: Casting formula contains variables not found in molten data: item

有人能看出我哪里做错了吗?我想更好地理解融化/转换!

完整代码:

## load the lme4 package 
library(lme4) 
data("VerbAgg")
head(VerbAgg)
names(VerbAgg) 

# Using base reshape()
wide <- reshape(VerbAgg, timevar=c("item"), 
                 idvar=c("id", 'Gender', 'Anger'), dir="wide")

# Using recast
library(reshape2)
wide2 <- recast(VerbAgg, id + Gender + Anger ~ item + variable)
wide3 <- recast(VerbAgg, id + Gender + Anger ~ item + variable, 
                id.var = c("id", "Gender", "Anger"))

# Using melt/cast
m <- melt(VerbAgg, id=c("id", "Gender", "Anger"))
wide <- o cast(m,id+Gender+Anger~...)
Aggregation requires fun.aggregate: length used as default
# Yields a list object with a length of 8? 

m <- melt(VerbAgg, id=c("id", "Gender", "Anger"), measure.vars = c(4,6,7,8,9))
wide <- dcast(m, id ~ variable)
# Yields a data frame object with 6 variables.

+1 是因为你喜欢理解融化/转换。 - agstudy
1
当我检查dim(wide)时,我得到了316行和123列的结果,这意味着wide产生了26个变量的316个观测值。 - agstudy
4
你最好将其熔化后再进行铸造——这样你就能更容易地看出问题出在哪里。 - hadley
agstudy,你是正确的。适当的尺寸是316行和123列。抱歉打错了。 - Twitch_City
Hadley,感谢您的回复!我们尝试了melt然后cast,但出现了一些其他奇怪的行为。我更新了问题以反映我们的尝试。显然,在定义melt/cast公式方面我漏掉了一些东西...有什么想法吗? - Twitch_City
1个回答

3
我认为下面的代码可以实现你想要的功能。
library(lme4) 
data("VerbAgg")

# Using base reshape()
wide <- reshape(VerbAgg, timevar=c("item"), 
                 idvar=c("id", 'Gender', 'Anger'), dir="wide")
dim(wide) # 316 123

# Using melt/cast
require(reshape2)
m1 <- melt(VerbAgg, id=c("id", "Gender", "Anger","item"), measure=c('resp','btype','situ','mode','r2'))
wide4 <- dcast(m1,id+Gender+Anger~item+variable)
dim(wide4) # 316 123

R> wide[1:5,1:6]
  Anger Gender id resp.S1WantCurse btype.S1WantCurse situ.S1WantCurse
1    20      M  1               no             curse            other
2    11      M  2               no             curse            other
3    17      F  3          perhaps             curse            other
4    21      F  4          perhaps             curse            other
5    17      F  5          perhaps             curse            other

R> wide4[1:5,1:6]
  id Gender Anger S1WantCurse_resp S1WantCurse_btype S1WantCurse_situ
1  1      M    20               no             curse            other
2  2      M    11               no             curse            other
3  3      F    17          perhaps             curse            other
4  4      F    21          perhaps             curse            other
5  5      F    17          perhaps             curse            other

谢谢!我没有意识到item应该被包含在id中。看起来很好,谢谢! - Twitch_City

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接