【问题标题】:R: Melt dataframe by 1 column and stack the other columns that have the same name patterns [duplicate]R:将数据框熔化一列并堆叠具有相同名称模式的其他列[重复]
【发布时间】:2021-11-27 02:24:45
【问题描述】:

我有这种简化的数据情况:

df <- data.frame(Year = 1:3,
                 A.x = 4:6,
                 A.y = 7:9,
                 A.z = 10:12,
                 B.x = 4:6,
                 B.y = 7:9,
                 B.z = 10:12,
                 C.x = 4:6,
                 C.y = 7:9,
                 C.z = 10:12)

我的目标是这样的:

df_goal <- data.frame(Year = rep(1:3, each = 3),
                 x = rep(4:6, each = 3),
                 y = rep(7:9, each = 3),
                 z = rep(10:12, each = 3))

请注意,这些值是任意的,只有列名、模式和目标年份的顺序很重要。

我尝试“手动”创建目标数据框,例如:列 i 包含从原始数据位置 xz 的值放。但它看起来真的很笨拙,因为我正在处理的数据非常庞大。有没有更好的方法更系统地重塑数据?

非常感谢!

【问题讨论】:

    标签: r merge reshape melt data-transform


    【解决方案1】:

    我们可能会使用pivot_longer

    library(dplyr)
    library(tidyr)
     df %>% 
       pivot_longer(cols = -Year, names_to = ".value", 
          names_pattern = "^[^.]+\\.(.*)")
    
    # A tibble: 9 × 4
       Year     x     y     z
      <int> <int> <int> <int>
    1     1     4     7    10
    2     1     4     7    10
    3     1     4     7    10
    4     2     5     8    11
    5     2     5     8    11
    6     2     5     8    11
    7     3     6     9    12
    8     3     6     9    12
    9     3     6     9    12
    

    【讨论】:

    • 非常感谢,这正是我所需要的。如果列名如下所示,您能否告诉我正则表达式应该是什么:aB_1_1、aB_1_2、...aB_1_6、aB_2_1、aB_2_2...、aB_12_6?
    • @Theodore 您需要作为输出的列是什么。如果您想将小写字母“a”作为names_pattern = "^([a-z])[A-Z]_.*" 列。如果两者都是aB,那么是否需要捕获"^([a-z][A-Z])_.*"
    • 我需要同时捕获它们,以及后面的数字,就像在示例中一样。非常感谢!
    • 是的,你太棒了!我现在终于可以睡觉了。非常感谢^^
    • 太完美了。你是最好的!感谢您对像我这样的新手有耐心:D
    猜你喜欢
    • 2020-04-01
    • 1970-01-01
    • 2018-04-12
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    相关资源
    最近更新 更多