【问题标题】:Data Table R: molten or reshape data table without stacked variable column数据表 R:没有堆叠变量列的熔融或重塑数据表
【发布时间】:2020-01-31 20:20:06
【问题描述】:

数据

str(DT)
Classes ‘data.table’ and 'data.frame':  6 obs. of  3b variables:
 $ A  : Factor w/ 6 levels "0","1","2","3",..: 1 2 3 4 5 6
 $ N  : num  13 11 10 5 1 1
 $ ID : Factor w/ 1 level "1": 1 1 1 1 1 1

我想将此 DT 重塑为下面的 DT。如果我通过melt.data.table(DT, id.vars = "ID", measure.vars = 1:2) 融化 DT,我会得到一个以下古怪的融化 DT。

   ID  N     variable value
 1: 1 13         A     0
 2: 1 11         A     1
 3: 1 10         A     2
 4: 1  5         A     3
 5: 1  1         A     4
 6: 1  1         A     5
 7: 1 13         N    13
 8: 1 11         N    11
 9: 1 10         N    10
10: 1  5         N     5
11: 1  1         N     1
12: 1  1         N     1

我想要的输出如下。基本上,熔融 DT 应该有一个变量(或新)列,而不是来自预熔融 DT 的堆叠变量列

期望的输出

     ID   variable  value    N 
 1:   1     A        0      13
 2:   1     A        1      11
 3:   1     A        2      10
 4:   1     A        3       5  
 5:   1     A        4       1
 6:   1     A        5       1

我会很感激任何指针

有点晚了,但这里有一个原始数据表:

   A  N  ID
1:   0 13   1
2:   1 11   1
3:   2 10   1
4:   3  5   1
5:   4  1   1
6:   5  1   1

【问题讨论】:

  • 你能展示你的 iinput 数据集吗
  • 古怪到底是什么意思?

标签: r data.table


【解决方案1】:

这个解决方案使用data.table::melt,就像在问题中一样。但与问题不同的是,所有不被堆叠的变量都在参数id.vars中。

library(data.table)

melt(dt1, id.vars = c("ID", "N"))
#   ID  N variable value
#1:  1 13        A     0
#2:  1 11        A     1
#3:  1 10        A     2
#4:  1  5        A     3
#5:  1  1        A     4
#6:  1  1        A     5

数据

dt1 <- data.table(A = factor(0:5),
                  N = c(13, 11, 10, 5, 1, 1),
                  ID = factor(1))

【讨论】:

    【解决方案2】:

    我们可以从tidyr 使用pivot_longer。使用@Rui Barradas 的数据。

    tidyr::pivot_longer(dt1, cols = A, names_to = 'variable') %>%
       dplyr::select(ID,variable, value ,N)
    
    # A tibble: 6 x 4
    #  ID    variable value     N
    #  <fct> <chr>    <fct> <dbl>
    #1 1     A        0        13
    #2 1     A        1        11
    #3 1     A        2        10
    #4 1     A        3         5
    #5 1     A        4         1
    #6 1     A        5         1
    

    【讨论】:

      【解决方案3】:

      如果输入数据集是 6 行数据集,那么我们可以将这些列创建为

      library(data.table)
      DT[, c('variable', 'value') := .('A', as.numeric(as.character(A)) -1)][, A := NULL][]
      #     N ID variable value
      #1: 13  1        A     0
      #2: 11  1        A     1
      #3: 10  1        A     2
      #4:  5  1        A     3
      #5:  1  1        A     4
      #6:  1  1        A     5
      

      数据

      DT <- data.table(A = factor(1:6), N = c(13, 11, 10, 5, 1, 1), ID = 1)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-14
        • 1970-01-01
        • 1970-01-01
        • 2018-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-30
        相关资源
        最近更新 更多