【问题标题】:subsetting dataframe based on column names using the ":" (example: subset column B and column D until F)使用“:”根据列名子集数据框(例如:子集 B 列和 D 列直到 F)
【发布时间】:2020-05-27 03:56:48
【问题描述】:

我有一个包含许多列 (50+) 的宽 data.table

一个简化的例子(有 5 列):

dt <- data.table(A = 1:10, B = 1, C = 1, D = 1, E = 1, F = 1, G = 1)

现在我想将 B 列和 D 列分成子集,直到 F

如果我只想要 D 到 F,我可以这样做:

dt[, D:F]

但是,我想保留 B 列。我可以长期实现我想要的结果,但这是我要避免的:

dt[, c("B", "D", "E", "F")]

我的问题是是否可以使用如下语法,这显然行不通:

dt[, c("B", D:F)]

请记住,这是一个简化的示例,“不选择 A、C、G”并不能真正解决我的问题。

我一直在想这个问题。我意识到我总是可以解决很长的路,但我想知道是否有快速的方法,因为我经常遇到这个问题。

非常感谢您的回复!

【问题讨论】:

    标签: r dataframe data.table subset


    【解决方案1】:

    base 中,您可以使用subset 选择列 B 和 D:F。

    subset(x, select = c(B, D:F))
    #   B D E F
    #1  1 1 1 1
    #2  1 1 1 1
    #3  1 1 1 1
    #4  1 1 1 1
    #5  1 1 1 1
    #6  1 1 1 1
    #7  1 1 1 1
    #8  1 1 1 1
    #9  1 1 1 1
    #10 1 1 1 1
    

    这也适用于data.table,其中cbind 也可以像这样使用:

    cbind(dt[,"B"], dt[, D:F])
    

    或者你可以使用match:

    i  <- match(c("B", "D", "F"), colnames(x))
    x[,c(i[1],i[2]:i[3])]
    

    数据:

    x <- data.frame(A = 1:10, B = 1, C = 1, D = 1, E = 1, F = 1, G = 1)
    
    library(data.table)
    dt <- data.table(x)
    

    【讨论】:

      【解决方案2】:

      另一种选择是:

      dt[, c(.(A), .SD), .SDcols=D:F]
      

      或将mget.SDcols 一起使用

      dt[, c(mget(c("A", "C")), .SD), .SDcols=E:G]
      

      【讨论】:

      • 我喜欢你使用.SDcols的方式
      【解决方案3】:

      在纯data.table 中必须有更好的解决方案,但无论如何: 这行得通(有点)

      library(data.table)
      dt <- data.table(A = 1:10, B = 1, C = 1, D = 1, E = 1, F = 1, G = 1)
      ind <- c("B", LETTERS[4:6])
      dt[, ..ind]
      
           B D E F
        1: 1 1 1 1
        2: 1 1 1 1
        3: 1 1 1 1
        4: 1 1 1 1
        5: 1 1 1 1
        6: 1 1 1 1
        7: 1 1 1 1
        8: 1 1 1 1
        9: 1 1 1 1
       10: 1 1 1 1
      

      【讨论】:

        【解决方案4】:

        我们可以从dplyr 中使用select,这很容易做到这一点

        library(dplyr)
        library(data.table)      
        dt %>% 
           select(B, D:F)
        #    B D E F
        # 1: 1 1 1 1
        # 2: 1 1 1 1
        # 3: 1 1 1 1
        # 4: 1 1 1 1
        # 5: 1 1 1 1
        # 6: 1 1 1 1
        # 7: 1 1 1 1
        # 8: 1 1 1 1
        # 9: 1 1 1 1
        #10: 1 1 1 1
        

        或者在[]中使用它

        dt[, select(.SD, B, D:F)]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-04-14
          • 2022-11-18
          • 2018-02-24
          • 2013-08-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多