【问题标题】:Reshaping dataframe with rankings用排名重塑数据框
【发布时间】:2014-01-31 19:51:03
【问题描述】:

我正在尝试将这个排名数据重新塑造成更图形化的东西.. 可能类似于:ggplot(party2, aes(x=Preference, y=Ranking, colour=id)+geom_line()。首先我必须重新塑造虽然它。

这是目前的数据:

> head(party)
  Theme Music/DJ Drink deals People Location
3     3        4           5      1        2
4     2        3           5      1        4
5     5        4           3      1        2
6     4        1           5      2        3

我们的目标是让数据看起来像这样:

id Preference     Ranking
1    Theme           3
1    Music/DJ        4
1    Drink deals     5
1    People          1
1    Location        2
2    Theme           2
2    Music/DJ        3
2    Drink deals     5

为了重塑数据,我使用了来自此链接的 Hadley 代码:How to reshape this dataframe with the reshape package,但我仍然遇到问题。我想我很接近了。

到目前为止我的代码是:

party.pref<-c("Theme", "Music/DJ", "Drink deals", "People", "Location")
party<-data[,party.pref]
party<-na.omit(party)
party2<-cbind(party, id=seq(1,nrow(party),1)) # Add IDs column
gp<-melt(party2, id="id", measured=party.pref)
dcast(gp, ... ~party.pref)

结果是这样的:

  id    variable   Drink deals Location Music/DJ People Theme
  1       Theme        <NA>     <NA>     <NA>   <NA>     3
  1    Music/DJ        <NA>     <NA>     <NA>   <NA>     4
  1 Drink deals        <NA>     <NA>     <NA>   <NA>     5
  1      People        <NA>     <NA>     <NA>   <NA>     1
  1    Location        <NA>     <NA>     <NA>   <NA>     2
  2       Theme        <NA>     <NA>        2   <NA>  <NA>

如您所见,如果所有这些因素列都变成了“排名”并且我摆脱了所有的 NA,我会得到我的答案,但我不知道该怎么做。我认为我在“dcast”或“melt”上做错了什么,但我不确定是哪个。

非常感谢任何帮助,谢谢!

【问题讨论】:

    标签: r reshape


    【解决方案1】:

    您需要使用melt,而不是dcastdcast 用于从长格式到宽格式,您正试图做相反的事情。

    party <- cbind(id=1:nrow(party), party) # add id
    melt(party, id.vars="id")               # melt, indicate "id" should be a column in result     
    

    这会产生:

    #     id variable value
    #  1   1    Theme     3
    #  2   2    Theme     4
    #  3   3    Theme     5
    #  4   4    Theme     6
    #  5   1 Music.DJ     3
    #  6   2 Music.DJ     2
    # ...
    # 20  4   People     2
    # 21  1 Location     2
    # 22  2 Location     4
    # 23  3 Location     2
    # 24  4 Location     3
    

    【讨论】:

    • 太完美了。我之前有过这个答案,但我没有意识到我必须(按 ID)对其进行排序才能获得我正在寻找的输出。谢谢!
    【解决方案2】:

    Alex,再添加一个信息。

    如果这些行意味着什么,并且您不想丢失信息,您应该再添加一列命名它们。然后你融化并重铸。

    party <- read.table(text=
    "Theme Music/DJ Drink/deals People Location
         3        4           5      1        2
         2        3           5      1        4
         5        4           3      1        2
         4        1           5      2        3", header=TRUE)
    
    ### Add one more column with the meaning of each line:
    party$ranking <- c("ranking1", "ranking2", "ranking3", "ranking4")
    
    party
    
    #This wil give you:
         Theme Music.DJ Drink.deals People Location  ranking
    1     3        4           5      1        2 ranking1
    2     2        3           5      1        4 ranking2
    3     5        4           3      1        2 ranking3
    4     4        1           5      2        3 ranking4
    
    #then melt and dcast
    library(reshape2)
    ranking <- melt(party)
    ranking <- dcast(ranking, variable~ranking)
    ranking
    
    #this will give you
        variable ranking1 ranking2 ranking3 ranking4
    1       Theme        3        2        5        4
    2    Music.DJ        4        3        4        1
    3 Drink.deals        5        5        3        5
    4      People        1        1        1        2
    5    Location        2        4        2        3
    

    【讨论】:

    • 谢谢;在这种情况下,它们不会......它们只是 id,但我以后会记住这一点
    猜你喜欢
    • 1970-01-01
    • 2013-01-27
    • 2015-10-07
    • 2012-10-01
    • 2012-12-10
    • 2022-12-05
    相关资源
    最近更新 更多