查找数据框中包含字符串向量中的一个元素的行的索引

Posted

技术标签:

【中文标题】查找数据框中包含字符串向量中的一个元素的行的索引【英文标题】:Find the index of the row in data frame that contain one element in a string vector 【发布时间】:2015-07-08 01:14:01 【问题描述】:

如果我有这样的 data.frame

df <- data.frame(col1 = c(letters[1:4],"a"),col2 = 1:5,col3 = letters[10:14])
 df
   col1 col2 col3
1    a    1    j
2    b    2    k
3    c    3    l
4    d    4    m
5    a    5    n

我想获取包含c("a", "k", "n") 中元素之一的行索引;在这个例子中,结果应该是1, 2, 5

【问题讨论】:

【参考方案1】:

如果你有一个大数据框并且你想检查所有的列,试试这个

x <- c("a", "k", "n")

Reduce(union, lapply(x, function(a) which(rowSums(df == a) > 0)))
# [1] 1 5 2

当然你可以对最终结果进行排序。

【讨论】:

【参考方案2】:
s <- c('a','k','n');
which(df$col1%in%s|df$col3%in%s);
## [1] 1 2 5

这是另一个解决方案。这适用于整个 data.frame,并且恰好将搜索字符串捕获为元素名称(您可以通过 unname() 摆脱这些):

sapply(s,function(s) which(apply(df==s,1,any))[1]);
## a k n
## 1 2 5

原来的第二个解决方案:

sort(unique(rep(1:nrow(df),ncol(df))[as.matrix(df)%in%s]));
## [1] 1 2 5

【讨论】:

非常感谢,适合这个例子。但是,如果data.frame中有很多列,恐怕这个解决方案不是很方便。 我觉得我必须指出你的问题没有提到“许多列”;它说“如果我有这样的 data.frame...”,然后呈现一个三列 data.frame,其中只有两列是字母搜索的明确候选者。对于此类任务,我的第一个解决方案无疑是最直接、最明显的解决方案。 非常感谢,真的是我的错。我应该更清楚地描述这个问题。 @ZihuGuo,查看编辑,我认为我原来的第二个解决方案不正确。这是因为我认为您可能希望结果按照 s 的顺序排列,IOW 按照原始搜索向量的顺序排列。我新的第二个解决方案保证了这一点。这是正确的吗? 非常感谢您的耐心。其实我不要那么多,我只想要行索引不管顺序。而且我认为 oringal 第二种解决方案更合适,因为有多行 conatian a.

以上是关于查找数据框中包含字符串向量中的一个元素的行的索引的主要内容,如果未能解决你的问题,请参考以下文章

保留数据框中的行,对于某些列的值的所有组合,在另一列中包含相同的元素

从数组中包含的行索引中选择矩阵的列[重复]

数据库创建索引的利弊

数据库索引的优点和缺点

如何将存储在 HDFS 中包含行的文本文件转换为 Pyspark 中的数据框?

如何获取熊猫数据框中的行,列中具有最大值并保留原始索引?