搜索字符串以忽略多个匹配项
Searching strings to ignore multiple matches
我有一个数据框,其列名如下所示:
d=c("Q.40a-some Text", "Q.40b-some Text", "Q.44a-some Text", "Q.44b-some Text" "Q.44c-some Text" "Q.44d-some Text" ,"Q.4a-some Text", "Q.4b-some Text")
我想识别以 Q.4 开头的列并忽略 Q.40、Q.44。
例如,识别 Q.44
或 Q.40
很容易。我所做的是使用此 "^Q.44"
或“^Q.40”作为我函数的输入。但是,如果我为识别 Q.4 做同样的事情,这就不起作用了——仅仅是因为所有的名字都以 Q.4 开头。那么,有人可以帮我吗?
更新
我想将结果传递给接受如下输入的函数:
multichoice<-function(data, question.prefix){
index<-grep(question.prefix, names(data)) # identifies the index for the available options in Q.12
cases<-length(index) # The number of possible options / columns
# Identify the range of possible answers for each question
# Step 1. Search for the min in each col and across each col choose the min
# step 2. Search for the max in each col and across each col choose the max
mn<-min(data[,index[1:cases]], na.rm=T)
mx<-max(data[,index[1:cases]], na.rm=T)
d = colSums(data[, index] != 0, na.rm = TRUE) # The number of elements across column vector, that are different from zero.
vec<-matrix(,nrow=length(mn:mx),ncol=cases)
for(j in 1:cases){
for(i in mn:mx){
vec[i,j]=sum(data[, index[j]] == i, na.rm = TRUE)/d[j] # This stores the relative responses for option j for the answer that is i
}
}
vec1<-as.data.frame(vec)
names(vec1)<-names(data[index])
vec1<-t(vec1)
return(vec1)
}
我使用函数的方式是这样的
q4 <-multichoice(df2,"^Q.4")
我打算通过“^Q.4”识别 Q.4
的列,而 df2
是我的数据框。
我们可以使用stringr
、
library(stringr)
str_extract(d, 'Q.[0-9]+') == 'Q.4'
#[1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE
#or
d[str_extract(d, 'Q.[0-9]+') == 'Q.4']
#[1] "Q.4a-some Text" "Q.4b-some Text"
如果格式始终相同(即 Q.[0-9]...),那么我们可以使用 gsub
gsub('\D', '', d) == 4
#[1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE
这是一个使用 grep
的方法:
return 指数
grep("^Q\.4[^0-9]", d)
列名中:
grep("^Q\.4[^0-9]", d, value=T)
这是可行的,因为 [^0-9] 表示任何不是数字的字符,所以我们按字面匹配 Q.4,然后匹配任何非数字的字符串。
我相信你在函数中的 mn 语句中想要的是
mn <- min(sapply(data[,index], min, na.rm=T), na.rm=T)
sapply
遍历所选索引 grep
选择的列,并找到 min
的最小值。然后,min
应用于所有列。
我有一个数据框,其列名如下所示:
d=c("Q.40a-some Text", "Q.40b-some Text", "Q.44a-some Text", "Q.44b-some Text" "Q.44c-some Text" "Q.44d-some Text" ,"Q.4a-some Text", "Q.4b-some Text")
我想识别以 Q.4 开头的列并忽略 Q.40、Q.44。
例如,识别 Q.44
或 Q.40
很容易。我所做的是使用此 "^Q.44"
或“^Q.40”作为我函数的输入。但是,如果我为识别 Q.4 做同样的事情,这就不起作用了——仅仅是因为所有的名字都以 Q.4 开头。那么,有人可以帮我吗?
更新
我想将结果传递给接受如下输入的函数:
multichoice<-function(data, question.prefix){
index<-grep(question.prefix, names(data)) # identifies the index for the available options in Q.12
cases<-length(index) # The number of possible options / columns
# Identify the range of possible answers for each question
# Step 1. Search for the min in each col and across each col choose the min
# step 2. Search for the max in each col and across each col choose the max
mn<-min(data[,index[1:cases]], na.rm=T)
mx<-max(data[,index[1:cases]], na.rm=T)
d = colSums(data[, index] != 0, na.rm = TRUE) # The number of elements across column vector, that are different from zero.
vec<-matrix(,nrow=length(mn:mx),ncol=cases)
for(j in 1:cases){
for(i in mn:mx){
vec[i,j]=sum(data[, index[j]] == i, na.rm = TRUE)/d[j] # This stores the relative responses for option j for the answer that is i
}
}
vec1<-as.data.frame(vec)
names(vec1)<-names(data[index])
vec1<-t(vec1)
return(vec1)
}
我使用函数的方式是这样的
q4 <-multichoice(df2,"^Q.4")
我打算通过“^Q.4”识别 Q.4
的列,而 df2
是我的数据框。
我们可以使用stringr
、
library(stringr)
str_extract(d, 'Q.[0-9]+') == 'Q.4'
#[1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE
#or
d[str_extract(d, 'Q.[0-9]+') == 'Q.4']
#[1] "Q.4a-some Text" "Q.4b-some Text"
如果格式始终相同(即 Q.[0-9]...),那么我们可以使用 gsub
gsub('\D', '', d) == 4
#[1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE
这是一个使用 grep
的方法:
return 指数
grep("^Q\.4[^0-9]", d)
列名中:
grep("^Q\.4[^0-9]", d, value=T)
这是可行的,因为 [^0-9] 表示任何不是数字的字符,所以我们按字面匹配 Q.4,然后匹配任何非数字的字符串。
我相信你在函数中的 mn 语句中想要的是
mn <- min(sapply(data[,index], min, na.rm=T), na.rm=T)
sapply
遍历所选索引 grep
选择的列,并找到 min
的最小值。然后,min
应用于所有列。