我想获取数据框中所有行的行号,其中列中的元素包含向量中的元素

时间:2017-11-02 12:06:15

标签: 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
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

我怎么能得到它?

3 个答案:

答案 0 :(得分:6)

最直接的,您可以使用charmatch

charmatch(vec, df$cat)
[1] 4 5 3 1 2

或使用grepsapply返回指定的向量。

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

删除'cat'列的数字子字符串后使用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。