【问题标题】:How to transform data frame with different column names from wide to long, with different column names如何将具有不同列名的数据框从宽转换为长,具有不同的列名
【发布时间】:2015-07-02 20:31:33
【问题描述】:

我有一个宽格式的数据框,我想将其转换为长格式(融化),以便进行处理。问题是“P”列有不同的名称,新数据框需要一个新的“通道”列,这样标题中的信息就不会丢失。请参阅下面的图片以获取图片。

这是数据框:

df <- read.table(text=
"ID    T    P.1 P.2 P.3
1   24.3    10.2    5.5 2.1
2   23.4    10.4    5.7 2.8
3   22.1    10.5    5.9 3.1
4   19.9    10.2    5.2 2.4
", header=T)

【问题讨论】:

    标签: r dataframe reshape melt


    【解决方案1】:
    reshape(df,direction="long", varying=list(names(df)[3:5]), v.names="Value",idvar=c("ID","T"))
             ID    T time Value
    1.24.3.1  1 24.3    1  10.2
    2.23.4.1  2 23.4    1  10.4
    3.22.1.1  3 22.1    1  10.5
    4.19.9.1  4 19.9    1  10.2
    1.24.3.2  1 24.3    2   5.5
    2.23.4.2  2 23.4    2   5.7
    3.22.1.2  3 22.1    2   5.9
    4.19.9.2  4 19.9    2   5.2
    1.24.3.3  1 24.3    3   2.1
    2.23.4.3  2 23.4    3   2.8
    3.22.1.3  3 22.1    3   3.1
    4.19.9.3  4 19.9    3   2.4
    

    【讨论】:

      【解决方案2】:

      这是一个相当简单的“宽”到“长”问题。以下是三种方法:

      使用“reshape2”

      library(reshape2)
      melt(df, id.vars = c("ID", "T"), variable.name = "Channel", value.name = "P")
      #    ID    T Channel    P
      # 1   1 24.3     P.1 10.2
      # 2   2 23.4     P.1 10.4
      # 3   3 22.1     P.1 10.5
      # 4   4 19.9     P.1 10.2
      # 5   1 24.3     P.2  5.5
      # 6   2 23.4     P.2  5.7
      # 7   3 22.1     P.2  5.9
      # 8   4 19.9     P.2  5.2
      # 9   1 24.3     P.3  2.1
      # 10  2 23.4     P.3  2.8
      # 11  3 22.1     P.3  3.1
      # 12  4 19.9     P.3  2.4
      

      带有基数 R 的 reshape

      reshape(df, direction = "long", 
              idvar = c("ID", "T"), 
              timevar = "Channel", 
              varying = 3:ncol(df))
      #          ID    T Channel    P
      # 1.24.3.1  1 24.3       1 10.2
      # 2.23.4.1  2 23.4       1 10.4
      # 3.22.1.1  3 22.1       1 10.5
      # 4.19.9.1  4 19.9       1 10.2
      # 1.24.3.2  1 24.3       2  5.5
      # 2.23.4.2  2 23.4       2  5.7
      # 3.22.1.2  3 22.1       2  5.9
      # 4.19.9.2  4 19.9       2  5.2
      # 1.24.3.3  1 24.3       3  2.1
      # 2.23.4.3  2 23.4       3  2.8
      # 3.22.1.3  3 22.1       3  3.1
      # 4.19.9.3  4 19.9       3  2.4
      

      使用“tidyr”+“dplyr”

      library(dplyr)
      library(tidyr)
      
      df %>%
        gather(Channel, P, P.1:P.3) %>%
        mutate(Channel = gsub("P.", "", Channel))
      #    ID    T Channel    P
      # 1   1 24.3       1 10.2
      # 2   2 23.4       1 10.4
      # 3   3 22.1       1 10.5
      # 4   4 19.9       1 10.2
      # 5   1 24.3       2  5.5
      # 6   2 23.4       2  5.7
      # 7   3 22.1       2  5.9
      # 8   4 19.9       2  5.2
      # 9   1 24.3       3  2.1
      # 10  2 23.4       3  2.8
      # 11  3 22.1       3  3.1
      # 12  4 19.9       3  2.4
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 2017-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-01
        相关资源
        最近更新 更多