12

我有这样的数据框:

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

我想找到df具有与字符串“a”匹配的值的列的索引。即它应该给我1作为结果。我尝试在 sapply 中使用 which 但它不起作用。任何人都知道如何在没有循环的情况下做到这一点?

4

2 回答 2

16

像这样的东西?

 which(apply(df, 2, function(x) any(grepl("a", x))))

步骤是:

  1. 遍历apply每一列
  2. 搜索是否a在此列中grepl
  3. 因为我们得到了一个向量,所以使用它any来获取TRUE是否有任何元素匹配到a
  4. 最后检查which元素(列)是TRUE(即包含搜索到的字母a)。
于 2012-10-25T06:18:16.193 回答
5

既然你提到你试图使用sapply()但没有成功,那么你可以这样做:

> sapply(df, function(x) any(x == "a"))
 col1  col2  col3 
 TRUE FALSE FALSE 
> which(sapply(df, function(x) any(x == "a")))
 col1 
    1

当然,如果您更喜欢字符串匹配,也可以使用grep()/方法。如果您只需要列号,grepl()您也可以which()使用包装您的函数。unname()

于 2012-10-25T07:22:29.060 回答