【发布时间】:2015-01-30 10:13:04
【问题描述】:
假设我们有一个表“数据”,其中包含几列中的字符串。我们希望找到包含某个值的所有行的索引,或者更好的是,几个值之一。但是,该列是未知的。
我现在做的是:
apply(df, 2, function(x) which(x == "M017"))
df =
1 04.10.2009 01:24:51 M017 <NA> <NA> NA
2 04.10.2009 01:24:53 M018 <NA> <NA> NA
3 04.10.2009 01:24:54 M051 <NA> <NA> NA
4 04.10.2009 01:25:06 <NA> M016 <NA> NA
5 04.10.2009 01:25:07 <NA> M015 <NA> NA
6 04.10.2009 01:26:07 <NA> M017 <NA> NA
7 04.10.2009 01:26:27 <NA> M017 <NA> NA
8 04.10.2009 01:27:23 <NA> M017 <NA> NA
9 04.10.2009 01:27:30 <NA> M017 <NA> NA
10 04.10.2009 01:27:32 M017 <NA> <NA> NA
11 04.10.2009 01:27:34 M051 <NA> <NA> NA
如果我们试图找到多个值,这也有效:
apply(df, 2, function(x) which(x %in% c("M017", "M018")))
结果是:
$`1`
integer(0)
$`2`
[1] 1 2 20
$`3`
[1] 16 17 18 19
$`4`
integer(0)
$`5`
integer(0)
但是,处理列表的结果列表相当繁琐。
有没有更有效的方法来查找在 ANY 列中包含一个值(或更多值)的行?
【问题讨论】:
-
你可以试试
which(df == "M017"), arr.ind=TRUE)它会给出行、列索引,你可以从中提取行。 -
对于多个值,我认为
apply基于家庭(sapply,lapply)的解决方案可能会更好。一种选择是矢量化。 IE。如果v1 <- c('M017', 'M018'); which(Vectorize(function(x) x %in% v1)(df), arr.ind=TRUE) -
谢谢,akrun,我删除了我的评论,因为你在我发布之前回答了我的问题。
-
您是否有很多要检查的值?如果不是,您可以轻松地将整个事物矢量化为
rowSums(df == "M017" | df == "M018", na.rm = TRUE) > 0L之类的东西,并避免apply一起循环。 -
@DavidArenburg 如果只有两个值,那将是我的选择。
标签: r