【问题标题】:Reshape a ragged, wide array with repeated variables to long in r将具有重复变量的参差不齐的宽数组重塑为 r 中的 long
【发布时间】:2014-04-16 12:38:57
【问题描述】:

我有一张这样的桌子

+------+---------+---------+---------+----------+---------+

| Code | Display | Synonym | Synonym | Synonym  | Synonym |

+------+---------+---------+---------+----------+---------+

|    1 | A       | Cat     | Dog     | Lion     |         |

|    2 | B       | Horse   | Penguin |          |         |

|    3 | C       | Donkey  | Giraffe | Mongoose | Rabbit  |

+------+---------+---------+---------+----------+---------+

我想输出一个类似的表格

+------+---------+----------+

| Code | Display | Synonym  |

+------+---------+----------+

|    1 | A       | Cat      |

|    1 | A       | Dog      |

|    1 | A       | Lion     |

|    2 | B       | Horse    |

|    2 | B       | Penguin  |

|    3 | C       | Donkey   |

|    3 | C       | Giraffe  |

|    3 | C       | Mongoose |

|    3 | C       | Rabbit   |

+------+---------+----------+

换句话说,我想将代码和显示与呈现的每个同义词配对,每个代码可以有 1 到多个同义词。我已经看到在其他情况下使用 reshape 的示例,但无法弄清楚如何在此处应用它。

【问题讨论】:

    标签: r text reshape tabular


    【解决方案1】:

    您可以对参差不齐的数组使用标准整形 - 使用 reshape2 中的 melt(),您可以使用 na.rm 参数随时删除 NAs,否则您可以在之后进行:

    library(reshape2)
    dat.m <- melt(dat, id.vars = c("Code", "Display"), value.name = "Synonym", na.rm = TRUE)
    #   Code Display  variable  Synonym
    #1     1       A   Synonym      Cat
    #2     2       B   Synonym    Horse
    #3     3       C   Synonym   Donkey
    #4     1       A Synonym.1      Dog
    #5     2       B Synonym.1  Penguin
    #6     3       C Synonym.1  Giraffe
    #7     1       A Synonym.2     Lion
    #9     3       C Synonym.2 Mongoose
    #12    3       C Synonym.3   Rabbit
    

    如果您愿意,可以删除 variable 列:

    dat.m$variable <- NULL
    

    【讨论】:

    • 对此进行了测试,它给出的结果比我自己的答案更清晰。谢谢@alexwhan!
    • 没问题。为了将来参考,您最好将问题中的数据以易于复制的格式放入,我希望这就是投票失败的原因
    【解决方案2】:

    这里有两种基本的 R 方法。

    stack

    cbind(mydf[1:2], stack(lapply(mydf[-c(1:2)], as.character)))
    #    Code Display   values       ind
    # 1     1       A      Cat   Synonym
    # 2     2       B    Horse   Synonym
    # 3     3       C   Donkey   Synonym
    # 4     1       A      Dog Synonym.1
    # 5     2       B  Penguin Synonym.1
    # 6     3       C  Giraffe Synonym.1
    # 7     1       A     Lion Synonym.2
    # 8     2       B          Synonym.2
    # 9     3       C Mongoose Synonym.2
    # 10    1       A          Synonym.3
    # 11    2       B          Synonym.3
    # 12    3       C   Rabbit Synonym.3
    

    reshape

    首先将列重命名为“Synonym_1”、“Synonym_2”等模式,让生活更轻松。其实R更喜欢“Synonym.1”、“Synonym.2”等等……

    A <- grep("Synonym", names(mydf))
    names(mydf)[A] <- paste0("Synonym_", seq_along(A))
    

    现在,重塑...

    reshape(mydf, direction = "long", varying = A, sep = "_")
    #     Code Display time  Synonym id
    # 1.1    1       A    1      Cat  1
    # 2.1    2       B    1    Horse  2
    # 3.1    3       C    1   Donkey  3
    # 1.2    1       A    2      Dog  1
    # 2.2    2       B    2  Penguin  2
    # 3.2    3       C    2  Giraffe  3
    # 1.3    1       A    3     Lion  1
    # 2.3    2       B    3           2
    # 3.3    3       C    3 Mongoose  3
    # 1.4    1       A    4           1
    # 2.4    2       B    4           2
    # 3.4    3       C    4   Rabbit  3
    

    【讨论】:

      【解决方案3】:

      在提出问题后不久,我想出了一个间接的方法来做到这一点:

      allergies_output <- reshape(allergies_input,varying=list(grep('Synonym',names(allergies_input),value=TRUE)),direction='long',idvar=c('Code','Display'),v.names='Synonym',names(allergies_input))
      

      这会产生一些不稳定的结果,但没有什么是不能通过删除一些列名来修复的。

      【讨论】:

      • 请参阅 my answer 了解另一种 reshape 方法。
      猜你喜欢
      • 2021-10-12
      • 1970-01-01
      • 2012-12-19
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多