【问题标题】:Select columns in data table in R在R中的数据表中选择列
【发布时间】:2018-04-09 18:38:33
【问题描述】:

我有"in_table",如下所示。我需要使用"Comb_table" 获取"Table1", "Table2", "Table3" 等等。基本上,当 Comb_table 中的变量为 1 时,我需要将其包含在列表中。

有没有比手动输入所有组合更有效的 R 语言方法?

感谢任何帮助。

谢谢。

in_table:

POL    Var1  Var2  Var3  Var4  Var5    Var6    Var7 
8035   1     11    1     GRD   0030    0110    09/30
36763  1     88    13    GRD   5260    0300    11/15
36763  1     88    13    GRD   5280    0300    11/15
35786  1     88    13    GRD   0030    0110    09/30


Comb_table:
        Var1  Var2  Var3  Var4  Var5  Var6  Var7
 Table1   1     1   1     1     1     1     1
 Table2   0     1   1     1     1     1     1
 Table3   1     0   1     1     1     1     1


Table1 <- in_table[, .(Pol_count = length(unique(POL))), by = list(Var1,Var2,Var3,Var4,Var5,Var6,Var7)] 

Table2 <- in_table[, .(Pol_count = length(unique(POL))), by = list(Var2,Var3,Var4,Var5,Var6,Var7)] 

Table3 <- in_table[, .(Pol_count = length(unique(POL))), by = list(Var1,Var3,Var4,Var5,Var6,Var7)] 

and so on. 

【问题讨论】:

标签: r data.table


【解决方案1】:
res = comb_table[, .(list(in_table[, uniqueN(POL), by = c(names(.SD)[.SD==1])])), by = tab]
#      tab           V1
#1: Table1 <data.table>
#2: Table2 <data.table>
#3: Table3 <data.table>

res$V1
#[[1]]
#   Var1 Var2 Var3 Var4 Var5 Var6  Var7 V1
#1:    1   11    1  GRD   30  110 09/30  1
#2:    1   88   13  GRD 5260  300 11/15  1
#3:    1   88   13  GRD 5280  300 11/15  1
#4:    1   88   13  GRD   30  110 09/30  1
#
#[[2]]
#   Var2 Var3 Var4 Var5 Var6  Var7 V1
#1:   11    1  GRD   30  110 09/30  1
#2:   88   13  GRD 5260  300 11/15  1
#3:   88   13  GRD 5280  300 11/15  1
#4:   88   13  GRD   30  110 09/30  1
#
#[[3]]
#   Var1 Var3 Var4 Var5 Var6  Var7 V1
#1:    1    1  GRD   30  110 09/30  1
#2:    1   13  GRD 5260  300 11/15  1
#3:    1   13  GRD 5280  300 11/15  1
#4:    1   13  GRD   30  110 09/30  1

【讨论】:

    【解决方案2】:

    这行得通:

    > library(magrittr)
    > melt(comb_table, id="tab", variable.factor=FALSE)[value == 1] %>% 
      split(by="tab") %>% 
      lapply(function(z) in_table[, .(n = uniqueN(POL)), by=c(z$variable)])
    
    $Table1
       Var1 Var2 Var3 Var4 Var5 Var6  Var7 n
    1:    1   11    1  GRD   30  110 09/30 1
    2:    1   88   13  GRD 5260  300 11/15 1
    3:    1   88   13  GRD 5280  300 11/15 1
    4:    1   88   13  GRD   30  110 09/30 1
    
    $Table3
       Var1 Var3 Var4 Var5 Var6  Var7 n
    1:    1    1  GRD   30  110 09/30 1
    2:    1   13  GRD 5260  300 11/15 1
    3:    1   13  GRD 5280  300 11/15 1
    4:    1   13  GRD   30  110 09/30 1
    
    $Table2
       Var2 Var3 Var4 Var5 Var6  Var7 n
    1:   11    1  GRD   30  110 09/30 1
    2:   88   13  GRD 5260  300 11/15 1
    3:   88   13  GRD 5280  300 11/15 1
    4:   88   13  GRD   30  110 09/30 1
    

    magrittr 在这里只是为了方便使用。

    或者,如果您可以将所有内容放在一个表中并使用 data.table >=1.10.5,则类似这样的内容(我还没有测试过...)应该适用于分组集:

    > melt(comb_table, id="tab", variable.factor=FALSE)[value == 1, groupingsets(
      in_table,
      sets = split(variable, tab)
    )]
    

    使用的数据:我决定 OP 的行名是/应该是名为“tab”的列。

    > dput(setDF(comb_table))
    structure(list(tab = c("Table1", "Table2", "Table3"), Var1 = c(1L, 
    0L, 1L), Var2 = c(1L, 1L, 0L), Var3 = c(1L, 1L, 1L), Var4 = c(1L, 
    1L, 1L), Var5 = c(1L, 1L, 1L), Var6 = c(1L, 1L, 1L), Var7 = c(1L, 
    1L, 1L)), .Names = c("tab", "Var1", "Var2", "Var3", "Var4", "Var5", 
    "Var6", "Var7"), row.names = c(NA, -3L), class = "data.frame")
    > dput(setDF(in_table))
    structure(list(POL = c(8035L, 36763L, 36763L, 35786L), Var1 = c(1L, 
    1L, 1L, 1L), Var2 = c(11L, 88L, 88L, 88L), Var3 = c(1L, 13L, 
    13L, 13L), Var4 = c("GRD", "GRD", "GRD", "GRD"), Var5 = c(30L, 
    5260L, 5280L, 30L), Var6 = c(110L, 300L, 300L, 110L), Var7 = c("09/30", 
    "11/15", "11/15", "09/30")), .Names = c("POL", "Var1", "Var2", 
    "Var3", "Var4", "Var5", "Var6", "Var7"), row.names = c(NA, -4L
    ), class = "data.frame")
    

    【讨论】:

      【解决方案3】:

      可能是这样的:

      创建一个因子,变量名称为1NA0

      nm_list <- data.frame( do.call("rbind", Map( function(x,y) as.character(factor(x, levels = c(0,1), labels = c(NA, y))),
                                                   x = Comb_table, y = names(Comb_table))),
                             stringsAsFactors = FALSE )
      nm_list
      #        X1   X2   X3
      # Var1 Var1 <NA> Var1
      # Var2 Var2 Var2 <NA>
      # Var3 Var3 Var3 Var3
      # Var4 Var4 Var4 Var4
      # Var5 Var5 Var5 Var5
      # Var6 Var6 Var6 Var6
      # Var7 Var7 Var7 Var7
      
      library('data.table')
      setDT(in_table)  # convert data frame to data table by reference
      lapply( nm_list, function(x) {
        x <- na.omit(x) # remove NA
        in_table[, .(Pol_count = length(unique(POL))), by = x]  # extract the variables by passing the values to by argument
      })
      
      # $X1
      #    Var1 Var2 Var3 Var4 Var5 Var6  Var7 Pol_count
      # 1:    1   11    1  GRD   30  110 09/30         1
      # 2:    1   88   13  GRD 5260  300 11/15         1
      # 3:    1   88   13  GRD 5280  300 11/15         1
      # 4:    1   88   13  GRD   30  110 09/30         1
      # 
      # $X2
      #    Var2 Var3 Var4 Var5 Var6  Var7 Pol_count
      # 1:   11    1  GRD   30  110 09/30         1
      # 2:   88   13  GRD 5260  300 11/15         1
      # 3:   88   13  GRD 5280  300 11/15         1
      # 4:   88   13  GRD   30  110 09/30         1
      # 
      # $X3
      #    Var1 Var3 Var4 Var5 Var6  Var7 Pol_count
      # 1:    1    1  GRD   30  110 09/30         1
      # 2:    1   13  GRD 5260  300 11/15         1
      # 3:    1   13  GRD 5280  300 11/15         1
      # 4:    1   13  GRD   30  110 09/30         1
      

      数据:

      in_table <- read.table(text='POL    Var1  Var2  Var3  Var4  Var5    Var6    Var7 
      8035   1     11    1     GRD   0030    0110    09/30
                             36763  1     88    13    GRD   5260    0300    11/15
                             36763  1     88    13    GRD   5280    0300    11/15
                             35786  1     88    13    GRD   0030    0110    09/30', header = TRUE)
      
      Comb_table <- read.table(text = 'Var1  Var2  Var3  Var4  Var5  Var6  Var7
       Table1   1     1   1     1     1     1     1
                               Table2   0     1   1     1     1     1     1
                               Table3   1     0   1     1     1     1     1')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-20
        • 1970-01-01
        • 1970-01-01
        • 2022-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多