【问题标题】:Having issues with melt in R在 R 中遇到问题
【发布时间】:2021-03-02 00:38:03
【问题描述】:

所以目前的数据是这样的。平均列是平均小时工资。 meanann 是平均年工资,因此最后是 ann。条目遵循相同的逻辑。但是,尝试使它看起来像下面的预期结果

   ID      mean    meanann    entry     entryann
  32100     100      5200       99         5148
  32101     101      5252      100         5200

预期结果

    ID      mean    entry
  32100     100      99
  32100     5200     5148
  32101     101      100
  32101     5252     5200

一直使用此 (https://ademos.people.uic.edu/Chapter8.html) 作为教学工具,但没有找到任何可以这样做的工具。我知道你会做一个融合并指定你的 ID 变量,但问题是它首先堆叠了我所有的平均观察值,然后是所有的平均值等等。

【问题讨论】:

    标签: r casting melt


    【解决方案1】:

    您可以使用来自tidyrpivot_longer 更轻松地做到这一点:

    tidyr::pivot_longer(df, 2:5, names_pattern = "^(mean|entry)", names_to = ".value")
    #> # A tibble: 4 x 3
    #>      ID  mean entry
    #>   <int> <int> <int>
    #> 1 32100   100    99
    #> 2 32100  5200  5148
    #> 3 32101   101   100
    #> 4 32101  5252  5200
    

    【讨论】:

    • 谢谢。但是,一些澄清的问题。 {4} .. 这是否代表原始中的列数?还有,2:5,这是指什么?
    • "(mean|entry)" 可能是更好更清晰的names_pattern
    • @TimWilcox 2:5 是包含值的列号。名称模式是一个正则表达式,用于将您希望合并的相关列集中在一起
    • @GregorThomas 你完全正确。已更新,谢谢。
    【解决方案2】:

    melt from data.table 可以使用patterns in measure

    library(data.table)
    melt(setDT(df), measure = patterns("^mean", "^entry"),
        value.name = c("mean", "entry"))[, variable := NULL][]
    #      ID mean entry
    #1: 32100  100    99
    #2: 32101  101   100
    #3: 32100 5200  5148
    #4: 32101 5252  5200
    

    数据

    df <- structure(list(ID = 32100:32101, mean = 100:101, meanann = c(5200L, 
    5252L), entry = 99:100, entryann = c(5148L, 5200L)), 
    class = "data.frame", row.names = c(NA, 
    -2L))
    

    【讨论】:

      猜你喜欢
      • 2018-09-24
      • 2021-10-31
      • 2017-01-13
      • 2020-03-04
      • 2019-03-01
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 2022-08-24
      相关资源
      最近更新 更多