【问题标题】:Changing R data frame from wide to long with calculated column使用计算列将 R 数据框从宽更改为长
【发布时间】:2020-08-20 08:14:11
【问题描述】:

我有一个宽数据框,我正在尝试将其转换为长数据框。我还想以长格式捕获一个新列。

一直在查看 couple posts 但卡住了。

例如,我有这个数据:

State   NumTotal    Num1    Num2    Num3    Num4
A       352         98      10      174     70
B       331         233     42      30      26

我想要这些数据:

State   NumClass    Num
A       Num1        98
A       Num2        10
A       Num3        174
A       Num4        70
B       Num1        233
B       Num2        42
B       Num3        30
B       Num4        26

我能得到的唯一实际输出来自这段代码(df_so 是带有数据的数据框):

long <- df_so %>%
  gather(State, NumTotal)

long

这是做什么的:

State   NumTotal
Num1    98
Num1    233
Num2    10
Num2    42
Num3    174
Num3    30
Num4    70
Num4    26

所以我丢失了 State 值(AB)并且知道我需要生成一个 NumClass 列但不知道如何。

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用data.table 中的melt 函数(还有reshape2::melt,但它已不再维护,因此应优先使用data.table::melt

    library(data.table)
    setDT(df)
    df2 <- melt(df, id.vars = "State")
    data.table::setnames(df2, old = "variable", new = "NumClass")
    

    【讨论】:

      【解决方案2】:

      gather 的继任者是 pivot_longer,这正是您想要的:

      library(tidyr)
      library(dplyr)
      
      data <- tibble(State = c("A", "B"),
                     NumTotal = c(352, 331),
                     Num1 = c(98,233),
                     Num2 = c(10, 42),
                     Num3 = c(174, 30),
                     num4 = c(70, 26))
      
      data %>% 
        select(-NumTotal) %>% 
        pivot_longer(starts_with("Num"))
      
      #> # A tibble: 8 x 3
      #>   State name  value
      #>   <chr> <chr> <dbl>
      #> 1 A     Num1     98
      #> 2 A     Num2     10
      #> 3 A     Num3    174
      #> 4 A     num4     70
      #> 5 B     Num1    233
      #> 6 B     Num2     42
      #> 7 B     Num3     30
      #> 8 B     num4     26
      

      首先我取消选择 NumTotal 列,因为您不使用它,然后通过匹配您要旋转的列的名称前缀将表旋转为长格式。要同时获取您想要的输出列名称,请以这种方式调用pivot_longer

      data %>% 
        select(-NumTotal) %>% 
        pivot_longer(starts_with("Num"), names_to = "NumClass", values_to = "NumTotal")
      
      #> # A tibble: 8 x 3
      #>   State NumClass NumTotal
      #>   <chr> <chr>       <dbl>
      #> 1 A     Num1           98
      #> 2 A     Num2           10
      #> 3 A     Num3          174
      #> 4 A     num4           70
      #> 5 B     Num1          233
      #> 6 B     Num2           42
      #> 7 B     Num3           30
      #> 8 B     num4           26
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-19
        • 1970-01-01
        • 1970-01-01
        • 2021-05-05
        • 1970-01-01
        • 1970-01-01
        • 2014-07-15
        相关资源
        最近更新 更多