如何基于字符串匹配选择R数据帧中的列

如何基于字符串匹配选择R数据帧中的列,r,dplyr,R,Dplyr,我认为还没有人问过这个确切的问题(无论如何,对于R来说) 我希望保留数据集中包含某个字符串的所有列(实际上有数百列),并删除其余的列。我已经找到了很多字符串搜索列名的例子,但是没有找到任何关于列名本身内容的例子 例如,假设我有以下数据集: df = data.frame(v1 = c(1, 8, 7, 'No number'), v2 = c(5, 3, 5, 1), v3 = c('Nothing', 4, 2, 9),

我认为还没有人问过这个确切的问题(无论如何,对于R来说)

我希望保留数据集中包含某个字符串的所有列(实际上有数百列),并删除其余的列。我已经找到了很多字符串搜索列名的例子,但是没有找到任何关于列名本身内容的例子

例如,假设我有以下数据集:

df = data.frame(v1 = c(1, 8, 7, 'No number'),
                v2 = c(5, 3, 5, 1),
                v3 = c('Nothing', 4, 2, 9),
                v4 = c(3, 8, 'Something', 6))
对于本例,假设我希望保留字符串为
No
的任何列,以便生成的数据集为:

         v1      v3
1         1 Nothing
2         8       4
3         7       2
4 No number       9
我在R怎么做?我对任何类型的解决方案都很满意(例如,base R、
dplyr
等)

提前谢谢

baser:

df[colSums(sapply(df, grepl, pattern = 'No')) > 0]

#         v1      v3
#1         1 Nothing
#2         8       4
#3         7       2
#4 No number       9
使用
dplyr

library(dplyr)
df %>% select(where(~any(grepl('No', .))))
基准R:

df[colSums(sapply(df, grepl, pattern = 'No')) > 0]

#         v1      v3
#1         1 Nothing
#2         8       4
#3         7       2
#4 No number       9
使用
dplyr

library(dplyr)
df %>% select(where(~any(grepl('No', .))))
使用
dplyr::select_if()
函数:

df <- df %>% select_if(function(col) any(grepl("No", col)))
df%select_if(函数(col)any(grepl(“No”,col)))
使用
dplyr::选择_if()
函数:

df <- df %>% select_if(function(col) any(grepl("No", col)))
df%select_if(函数(col)any(grepl(“No”,col)))
简单

df[grep("No", df)]
#          v1      v3
# 1         1 Nothing
# 2         8       4
# 3         7       2
# 4 No number       9
这是可行的,因为
grep
在内部检查
是否(!is.character(x))
如果这是真的,它基本上会:

s <- structure(as.character(df), names = names(df))
s
# v1 
# "c(\"1\", \"8\", \"7\", \"No number\")" 
# v2 
# "c(5, 3, 5, 1)" 
# v3 
# "c(\"Nothing\", \"4\", \"2\", \"9\")" 
# v4 
# "c(\"3\", \"8\", \"Something\", \"6\")" 
grep("No", s)
# [1] 1 3
简单地

这是可行的,因为
grep
在内部检查
是否(!is.character(x))
如果这是真的,它基本上会:

s <- structure(as.character(df), names = names(df))
s
# v1 
# "c(\"1\", \"8\", \"7\", \"No number\")" 
# v2 
# "c(5, 3, 5, 1)" 
# v3 
# "c(\"Nothing\", \"4\", \"2\", \"9\")" 
# v4 
# "c(\"3\", \"8\", \"Something\", \"6\")" 
grep("No", s)
# [1] 1 3

您可以为每个列运行
grepl
,如果其中有任何值,请选择它

df = data.frame(v1 = c(1, 8, 7, 'No number'),
                v2 = c(5, 3, 5, 1),
                v3 = c('Nothing', 4, 2, 9),
                v4 = c(3, 8, 'Something', 6))

find.no <- sapply(X = df, FUN = function(x) {
  any(grep("No", x = x))
})

> df[, find.no]
         v1      v3
1         1 Nothing
2         8       4
3         7       2
4 No number       9
df=data.frame(v1=c(1,8,7,'无编号'),
v2=c(5,3,5,1),
v3=c('Nothing',4,2,9),
v4=c(3,8,‘某物’,6))
find.no df[,find.no]
v1 v3
1什么都没有
2         8       4
3         7       2
4号9号

您可以为每个列运行
grepl
,如果其中有任何值,请选择它

df = data.frame(v1 = c(1, 8, 7, 'No number'),
                v2 = c(5, 3, 5, 1),
                v3 = c('Nothing', 4, 2, 9),
                v4 = c(3, 8, 'Something', 6))

find.no <- sapply(X = df, FUN = function(x) {
  any(grep("No", x = x))
})

> df[, find.no]
         v1      v3
1         1 Nothing
2         8       4
3         7       2
4 No number       9
df=data.frame(v1=c(1,8,7,'无编号'),
v2=c(5,3,5,1),
v3=c('Nothing',4,2,9),
v4=c(3,8,‘某物’,6))
find.no df[,find.no]
v1 v3
1什么都没有
2         8       4
3         7       2
4号9号

这对我不起作用。你使用的是什么版本的R?@RomanLuštrik R4.0.3对我来说很好。R4.0.2对我来说也很好。但我从没见过这个<在
grep()
文档中似乎没有提到code>data.frame。这对我不起作用。你使用的是什么版本的R?@RomanLuštrik R4.0.3对我来说很好。R4.0.2对我来说也很好。但我从没见过这个
data.frame
grep()
文档中似乎没有提到。