我有一个看起来像这样的字符向量
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
我怎么能得到它?
答案 0 :(得分:6)
最直接的,您可以使用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")
然后用它来返回一个命名向量
vecGrep(Categories, df$cat, fixed=TRUE)
d- e- c- a- b-
4 5 3 1 2
数据强>
vec <- c("d-", "e-", "c-", "a-", "b-")
df = data.frame(name = c(1:10), cat = paste(c(letters[1:10]), "-1", sep = ""))
答案 1 :(得分:2)
我们也可以在使用match
sub
match(Categories, sub("\\d+$", "", df$cat))
#[1] 4 5 3 1 2
答案 2 :(得分:0)
我有一个解决方案,它使用for-loop而不是你的categories-vector
rownums <- numeric()
for (i in 1:length(Categories)) {
rownums[length(rownums) + 1] <- grep(Categories[i], df$cat)
}
grep()
- 命令返回包含df$cat
的{{1}}中的rownumbers。结果保存在Categories[i]
- vector。