我有一个数据帧df,列名从m1到m100删除R中的多列
我想删除m50到m100范围内的列。有没有更快的方式做到这一点比硬编码
df <- subset(df_cohort, select = -c("M50","M51","M52","M53"......,"M100"))
我有一个数据帧df,列名从m1到m100删除R中的多列
我想删除m50到m100范围内的列。有没有更快的方式做到这一点比硬编码
df <- subset(df_cohort, select = -c("M50","M51","M52","M53"......,"M100"))
随着dplyr你可以做这样的:
library(dplyr)
df <- select(df, -(M50:M100))
这将删除列 “M50” 和列 “M100” 之间的所有列。
不同的选项,不依赖列的顺序是使用
df <- select(df, -num_range("M", 50:100))
假设你已经是这样的:
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))
更雄辩地,无需使用任何外部包装或额外的函数调用,只需使用的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
我们可以在分配列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]