如何基于字符串匹配选择R数据帧中的列
我认为还没有人问过这个确切的问题(无论如何,对于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),
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()
文档中似乎没有提到。