【问题标题】:How can I transform a long-formated data frame to a wide-formated one with multiple values within a cell in R?如何将长格式数据框转换为在 R 中的单元格内具有多个值的宽格式数据框?
【发布时间】:2016-03-28 22:12:30
【问题描述】:

这是原始的df:

    area sector      item
1   East      A      <NA>
2  South      A     Baidu
3  South      A   Tencent
4   West      A      <NA>
5  North      A      <NA>
6   East      B Microsoft
7   East      B    Google
8   East      B  Facebook
9  South      B      <NA>
10  West      B      <NA>
11 North      B      <NA>
12  East      C      <NA>
13 South      C      <NA>
14  West      C      <NA>
15 North      C   Alibaba
16  East      D      <NA>
17 South      D      <NA>
18  West      D    Amazon
19 North      D      <NA>
20  East      E      <NA>
21 South      E      <NA>
22  West      E      <NA>
23 North      E      <NA>

如何将上述 df 转换为以下 df?转换后的 df 中的一些单元格具有原始 df 的多个项目。

  Sector                     East            South     West     North
1 A                          <NA> "Baidu, Tencent"     <NA>      <NA>
2 B "Microsoft, Google, Facebook"             <NA>     <NA>      <NA>
3 C                          <NA>             <NA>     <NA> "Alibaba"
4 D                          <NA>             <NA> "Amazon"      <NA>
5 E                          <NA>             <NA>     <NA>      <NA>

【问题讨论】:

    标签: r dataframe reshape


    【解决方案1】:

    一个快速的解决方案是使用toString 函数,同时使用reshape2 包从长转换为宽

    reshape2::dcast(df, sector ~ area, toString)
    #Using item as value column: use value.var to override.
    #   sector                        East   North          South   West
    # 1      A                        <NA>    <NA> Baidu, Tencent   <NA>
    # 2      B Microsoft, Google, Facebook    <NA>           <NA>   <NA>
    # 3      C                        <NA> Alibaba           <NA>   <NA>
    # 4      D                        <NA>    <NA>           <NA> Amazon
    # 5      E                        <NA>    <NA>           <NA>   <NA>
    

    这几乎是 this 的骗局,但那里的大多数解决方案都不适用于这种情况 - 但这仍然可以给你一些想法。

    【讨论】:

      【解决方案2】:

      只是为了好玩,这里有一个基本解决方案:

      reshape(aggregate(item ~ area + sector, data = df, paste, collapse = ","), 
          idvar = "sector", timevar = "area", direction = "wide")
         sector                 item.East item.North    item.South item.West
      1       A                      <NA>       <NA> Baidu,Tencent      <NA>
      5       B Microsoft,Google,Facebook       <NA>          <NA>      <NA>
      9       C                      <NA>    Alibaba          <NA>      <NA>
      13      D                      <NA>       <NA>          <NA>    Amazon
      17      E                      <NA>       <NA>          <NA>      <NA>
      

      【讨论】:

        【解决方案3】:

        这是dplyr/tidyr的选项

        library(dplyr)
        library(tidyr)
        df1 %>%
           group_by(area, sector) %>% 
           summarise(item = toString(item)) %>% 
           spread(area, item)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-28
          • 1970-01-01
          • 2014-06-07
          • 2023-02-25
          • 1970-01-01
          • 2020-09-18
          • 2021-11-16
          • 2013-10-22
          相关资源
          最近更新 更多