删除R中的多个列

时间:2015-12-30 13:56:11

标签: r

我有一个数据帧df,列名从m1到m100

我想删除m50到m100范围内的列。有没有比硬编码更快的方法

df <- subset(df_cohort, select = -c("M50","M51","M52","M53"......,"M100") )

4 个答案:

答案 0 :(得分:3)

假设你有类似的东西:

mydf <- data.frame(matrix(1:100, ncol = 100, 
                          dimnames = list(NULL, paste0("m", 1:100))))

简单地说:

mydf[paste0("m", 50:100)] <- list(NULL)  ## This is pretty destructive ;-)

顺便说一下,你也可以这样做:

subset(mydf, select = m1:m49)

subset(mydf, select = -(m50:m100))

答案 1 :(得分:1)

使用dplyr你可以这样做:

library(dplyr)
df <- select(df, -(M50:M100))

这将删除列“M50”和列“M100”之间的所有列。

不依赖于列顺序的其他选项是使用

df <- select(df, -num_range("M", 50:100))

答案 2 :(得分:0)

更加雄辩地说,不使用任何外部包或额外的函数调用,只需使用R的逻辑子集:

mydf <- data.frame(matrix(1:100, ncol = 100, 
                          dimnames = list(NULL, paste0("M", 1:100))))

mydf[,1:49]

得到以下特性:

> mydf[,1:49]
  m1 m2 m3 m4 m5 m6 m7 m8 m9 m10 m11 m12 m13 m14 m15 m16 m17 m18 m19 m20 m21 m22
1  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22
  m23 m24 m25 m26 m27 m28 m29 m30 m31 m32 m33 m34 m35 m36 m37 m38 m39 m40 m41 m42
1  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42
  m43 m44 m45 m46 m47 m48 m49
1  43  44  45  46  47  48  49

答案 3 :(得分:0)

我们可以在data.table

中将列分配为NULL
library(data.table)
setDT(df_cohort)[, paste0('M', 50:100) := NULL]

如果我们需要子集,

setDT(df_cohort)[, setdiff(names(df_cohort), 
                    paste0('m', 50:100)), with=FALSE]