2015-12-30 130 views
0

我有一個數據幀df,列名從m1到m100刪除R中的多列

我想刪除m50到m100範圍內的列。有沒有更快的方式做到這一點比硬編碼

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

回答

1

隨着dplyr你可以做這樣的:

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

這將刪除列 「M50」 和列 「M100」 之間的所有列。

不同的選項,不依賴列的順序是使用

df <- select(df, -num_range("M", 50:100)) 
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)) 
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 
0

我們可以在分配列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]