我想提取一个包含所有变量名称(其值(而非名称本身)包含特定字符串)的向量。
例如:
> dat
Name Mark1 Mark2 Mark3
1 A 67% 61% 87
2 B 98% 83% 26
3 C 42% 62% 98
4 D 83% 32% 36
5 E 40% 90% 80
6 F 89% 25% 44
从上面的数据框中,我想要变量名称,其值包含'%'符号。到目前为止,我一直在使用for循环来执行此操作,但这似乎是完成简单任务的漫长路途。
> prct <- c()
> for (i in 1:ncol(dat)){
if (any(grepl("%", dat[,i]) == T)){
prct <- c(prct, colnames(dat)[i])
}
}
> prct
[1] "Mark1" "Mark2"
答案 0 :(得分:1)
如果Mark1
和Mark2
中的每个值都包含一个%
,我们只能检查第一行:
colnames(df)[grepl('%', df[1,])]
[1] "Mark1" "Mark2"
否则,可以将apply
与MARGIN = 2
一起使用,以将此函数应用于每一列并返回一个命名的逻辑向量:
apply(df, 2, function(x) any(grepl('%', x)))
Name Mark1 Mark2 Mark3
FALSE TRUE TRUE FALSE
如果只需要变量名,请使用此逻辑向量作为colnames(df)
的子集:
colnames(df)[apply(df, 2, function(x) any(grepl('%', x)))]
[1] "Mark1" "Mark2"
答案 1 :(得分:0)
使用tidyverse:
df<-read.table(text=
" Name Mark1 Mark2 Mark3
1 A 67% 61% 87
2 B 98% 83% 26
3 C 42% 62% 98
4 D 83% 32% 36
5 E 40% 90% 80
6 F 89% 25% 44",h=TRUE)
f <- function(x) any(str_detect(x,"%"))
df %>% select_if(f) %>% colnames
#[1] "Mark1" "Mark2"
或者:
df %>% select_if(funs(any(str_detect(.,"%")))) %>% colnames