【问题标题】: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

【问题讨论】:

    标签: r dataframe string-matching


    【解决方案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.
      猜你喜欢
      • 2016-03-03
      • 1970-01-01
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      • 2015-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多