【问题标题】:Reshape aggregated rows to new columns, categorical data将聚合行重塑为新列、分类数据
【发布时间】:2013-01-13 18:07:27
【问题描述】:

我正在尝试使用 R 将行聚合到列。这是我的数据集示例。

age sex hash                                emotion     color
22  1   b17f9762462b37e7510f0e6d2534530d    Lonely      #006666
22  1   b17f9762462b37e7510f0e6d2534530d    Energetic   #66CC00
22  1   b17f9762462b37e7510f0e6d2534530d    Calm        #FFFFFF
22  1   b17f9762462b37e7510f0e6d2534530d    Angry       #FF0000
24  1   7bb50ca97a9b517239b39440a966d2f6    Calm        #006666
24  1   7bb50ca97a9b517239b39440a966d2f6    Excited     #0033cc
24  1   7bb50ca97a9b517239b39440a966d2f6    Empty/void  #999999
24  1   7bb50ca97a9b517239b39440a966d2f6    No emotion  #FF6600
26  1   209f1ba8ef86e855deccc0aae120825c    Comfortable #330066
21  1   b9e9309c0b1255a7efb2edf9ba66ae46    Energetic   #330099
21  1   b9e9309c0b1255a7efb2edf9ba66ae46    Happy       #330066
26  1   209f1ba8ef86e855deccc0aae120825c    No emotion  #FFCC00
26  1   209f1ba8ef86e855deccc0aae120825c    Calm        #006666
21  1   61debd3dea6d1aacce5c9fc7daec4fe5    Empty/void  #FFFFFF
21  1   b9e9309c0b1255a7efb2edf9ba66ae46    Calm        #006666
26  1   209f1ba8ef86e855deccc0aae120825c    No emotion  #339900
21  1   61debd3dea6d1aacce5c9fc7daec4fe5    Loved       #FF6600
26  1   209f1ba8ef86e855deccc0aae120825c    No emotion  #66CC00

我想做的是得到这个:

age sex hash            #000000 #FF0000 ... #FFFFFF
22  1   8798tkojstwz9ei sad     happy   ... loved
...

一个响应由哈希定义,相关数据是年龄和性别。

我希望将每个响应设为 1 而不是几列。每种颜色都应该有它自己的列,并将相关的情感作为该列的值。

整个数据集有 13 种颜色、20 多种情绪和 1000 多种响应。数据集看起来与示例完全相同,并存储在 mySQL 数据库中。

我尝试过 reshape,但它不能很好地处理分类数据,或者我没有使用适当的函数。有任何想法吗?如果需要,它可以包括一些 mySQL 准备工作。 Java 在这里非常慢,因为我有 12k+ 行,所以 R 听起来很合适。

谢谢。

【问题讨论】:

  • 我认为aggregate 不适合这个问题的标题(或标签)。您能否考虑将问题重新命名为更准确地描述您的问题所在?
  • 当然,你有什么建议?
  • 不确定!这完全取决于您卡在哪里,因为如果尝试类似的任务,其他人也可能会卡在哪里。更准确的标题和标签将增加这些用户找到他们正在寻找的答案的机会。顺便说一句,欢迎来到 SO!

标签: r reshape


【解决方案1】:

使用reshape2

dcast(dat,...~color,value.var='emotion')
  age sex                             hash #0033cc #006666     #330066   #330099   #339900   #66CC00 #999999 #FF0000   #FF6600
1  21   1 61debd3dea6d1aacce5c9fc7daec4fe5    <NA>    <NA>        <NA>      <NA>      <NA>      <NA>    <NA>    <NA>     Loved
2  21   1 b9e9309c0b1255a7efb2edf9ba66ae46    <NA>    Calm       Happy Energetic      <NA>      <NA>    <NA>    <NA>      <NA>
3  22   1 b17f9762462b37e7510f0e6d2534530d    <NA>  Lonely        <NA>      <NA>      <NA> Energetic    <NA>   Angry      <NA>
4  24   1 7bb50ca97a9b517239b39440a966d2f6 Excited    Calm        <NA>      <NA>      <NA>      <NA>   Empty    <NA> Noemotion
5  26   1 209f1ba8ef86e855deccc0aae120825c    <NA>    Calm Comfortable      <NA> Noemotion Noemotion    <NA>    <NA>      <NA>
    #FFCC00 #FFFFFF
1      <NA>   Empty
2      <NA>    <NA>
3      <NA>    Calm
4      <NA>    <NA>
5 Noemotion    <NA>

【讨论】:

  • 当我使用您的函数时,我收到以下警告:“缺少聚合函数:默认为长度”。结果是一个表,其中值是 1 和 0,而不是分类情感值。
  • @frinx 输出显示它对我有用。你使用的是哪个版本的 reshape2?这也取决于我如何读取您的数据。你可以 dput(head(dat)) 来测试吗?
  • 我刚刚下载并安装了 reshape2,所以它应该是最新的。 dput(head(dat))输出:结构(列表(年龄= c(22L,22L,22L,22L,22L,22L),性别= c(1L,1L,1L,1L,1L,1L),sessionid =结构(c(679L, 679L, 679L, 679L, 679L, 679L), .Label = c([哈希列表])), class= "因子"), 情感 = 结构(c(16L, 10L, 4L, 19L, 13L, 14L), .Label = c([情绪列表]), class= "因子"), color = structure(c(3L, 8L, 2L, 5L, 6L, 12L), .Label = c([列表颜色]), class= "因子")), .Names = c("age", "sex", "hash", "emotion", "color"), row.names = c(NA, 6L), class= "data.frame")
【解决方案2】:

如果我正确理解您的目标,reshape() 确实是您正在寻找的功能。假设您的数据集名为 mydf,请尝试以下操作:

reshape(mydf, direction = "wide", 
        idvar = c("hash", "age", "sex"), 
        timevar = "color")
#    age sex                             hash emotion.#006666 emotion.#66CC00
# 1   22   1 b17f9762462b37e7510f0e6d2534530d          Lonely       Energetic
# 5   24   1 7bb50ca97a9b517239b39440a966d2f6            Calm            <NA>
# 9   26   1 209f1ba8ef86e855deccc0aae120825c            Calm      No emotion
# 10  21   1 b9e9309c0b1255a7efb2edf9ba66ae46            Calm            <NA>
# 14  21   1 61debd3dea6d1aacce5c9fc7daec4fe5            <NA>            <NA>
# emotion.#FFFFFF emotion.#FF0000 emotion.#0033cc emotion.#999999 emotion.#FF6600
# 1             Calm           Angry            <NA>            <NA>            <NA>
# 5             <NA>            <NA>         Excited      Empty/void      No emotion
# 9             <NA>            <NA>            <NA>            <NA>            <NA>
# 10            <NA>            <NA>            <NA>            <NA>            <NA>
# 14      Empty/void            <NA>            <NA>            <NA>           Loved
# emotion.#330066 emotion.#330099 emotion.#FFCC00 emotion.#339900
# 1             <NA>            <NA>            <NA>            <NA>
# 5             <NA>            <NA>            <NA>            <NA>
# 9      Comfortable            <NA>      No emotion      No emotion
# 10           Happy       Energetic            <NA>            <NA>
# 14            <NA>            <NA>            <NA>            <NA>

如果需要,您可以稍后重命名列。

【讨论】:

  • 下次我会用重塑解决方案打败你:)
  • @agstudy,你说的是base R,还是“reshape2”;)——无论如何,我认为有几个答案向OP展示可用的选项总是好的。
猜你喜欢
  • 2019-04-08
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
相关资源
最近更新 更多