【问题标题】:R - pivoting long into wide with using part of the value as name postfixR - 使用部分值作为名称后缀从长到宽
【发布时间】:2020-09-06 09:18:45
【问题描述】:

我有这样的数据框:

tall <- data.frame(X=c(1,2,3,4,5,6), Y=c(1.1, 2.1, 3.1, 1.2, 2.2, 3.2))

  X   Y
1 1 1.1
2 2 2.1
3 3 3.1
4 4 1.2
5 5 2.2
6 6 3.2

我想要这个:

wide <- data.frame(X.1 = c(1,2,3), X.2 = c(4,5,6), Y = c(1,2,3))

  X.1 X.2 Y
1   1   4 1
2   2   5 2
3   3   6 3

初始“Y”变量具有两部分值(“.”之前和之后)。我想要的是使用“Y”值的第二部分将“X”列分成两列。 “Y”值的第一部分应该在“Y”变量中保持不变。就像我想分离“Y”变量的一部分并将其用作将X变量一分为二的基础。

我尝试使用带有 name_prefix 或 name_patterns 的“pivot_wider”,但我卡住了。我是中级 R 用户,所以请提出一些不复杂的建议;) 谢谢!

【问题讨论】:

    标签: r pivot tidyr


    【解决方案1】:

    separateY列分成两列然后获取宽格式数据。

    library(tidyr)
    
    tall %>%
      separate(Y, c('Y', 'Y2'), sep = '\\.') %>%
      pivot_wider(names_from = Y2, values_from = X, names_prefix = 'X.')
    
    # A tibble: 3 x 3
    #  Y       X.1   X.2
    #  <chr> <dbl> <dbl>
    #1 1         1     4
    #2 2         2     5
    #3 3         3     6
    

    【讨论】:

    • 谢谢!这是一个靶心,从来没有这么简单,但我之前从未使用过“分离”功能
    【解决方案2】:

    我们可以使用data.table

    library(data.table)
    dcast(setDT(tall)[, c('Y', 'Y2') := tstrsplit(Y, split="\\.")],
           Y ~ paste0('X.', Y2), value.var = 'X')
    #   Y X.1 X.2
    #1: 1   1   4
    #2: 2   2   5
    #3: 3   3   6
    

    【讨论】:

    • 谢谢!很好的解决方案,但我现在尝试将其全部保留在 tidyverse 中。总之,很高兴知道data.table可以很好地处理它,似乎值得学习
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 2017-01-19
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2016-12-25
    相关资源
    最近更新 更多