R 我想获取数据帧中所有行的行号,其中列中的元素包含向量中的元素
我有一个像这样的字符向量R 我想获取数据帧中所有行的行号,其中列中的元素包含向量中的元素,r,dataframe,R,Dataframe,我有一个像这样的字符向量 Categories = sample(make.unique(rep(letters, length.out = 5), sep='')) Categories [1] "d-" "e-" "c-" "a-" "b-" 我有一个数据帧df,看起来像: df = data.frame(name = c(1:10), cat = paste(c(letters[1:10]), "-1", sep = "")) df name cat 1 1 a-1
Categories = sample(make.unique(rep(letters, length.out = 5), sep=''))
Categories
[1] "d-" "e-" "c-" "a-" "b-"
我有一个数据帧df,看起来像:
df = data.frame(name = c(1:10), cat = paste(c(letters[1:10]), "-1", sep = ""))
df
name cat
1 1 a-1
2 2 b-1
3 3 c-1
4 4 d-1
5 5 e-1
6 6 f-1
7 7 g-1
8 8 h-1
9 9 i-1
10 10 j-1
我想按照类别元素包含在df的“cat”列中的顺序获取df中的行号。所以,我想
dfRowNumbers
[1] 4,5,3,1,2
我怎样才能得到它呢?我有一个解决方案,它在类别向量上使用for循环
rownums <- numeric()
for (i in 1:length(Categories)) {
rownums[length(rownums) + 1] <- grep(Categories[i], df$cat)
}
rownums最直接的方法是使用charmatch
charmatch(vec, df$cat)
[1] 4 5 3 1 2
或者使用grep
和sapply
返回命名向量
sapply(Categories, grep, df$cat, fixed=TRUE)
d- e- c- a- b-
4 5 3 1 2
要获得一点语义糖分,请使用Vectorize
构建您自己的函数:
vecGrep <- Vectorize(grep, vectorize.args="pattern")
数据
vec <- c("d-", "e-", "c-", "a-", "b-")
df = data.frame(name = c(1:10), cat = paste(c(letters[1:10]), "-1", sep = ""))
vec在用sub
删除“cat”列的数字子字符串后,我们还可以使用match
match(Categories, sub("\\d+$", "", df$cat))
#[1] 4 5 3 1 2
match(Categories, sub("\\d+$", "", df$cat))
#[1] 4 5 3 1 2