【问题标题】:Subset R data frame based on string matches in two columns基于两列中的字符串匹配的子集 R 数据框
【发布时间】:2017-01-21 15:06:19
【问题描述】:

我有一个包含三列和数千行的数据框。前两列(x 和 y)包含字符串,第三列 (z) 包含数字数据。我需要根据前两列中的匹配值对数据框进行子集化。

    x <- c("a", "b", "c", "d", "f", "g", "h", "i", "j", "k")
    y <- c("h", "b", "k", "a", "g", "d", "i", "c", "f", "j")
    z <- c(1:10)
    df <- data.frame(x, y, z)

       x y  z
    1  a h  1
    2  b b  2
    3  c k  3
    4  d a  4
    5  f g  5
    6  g d  6
    7  h i  7
    8  i c  8
    9  j f  9
    10 k j 10

假设这是我的表,我感兴趣的值是“a”、“c”、“f”、“h”和“k”。我只想返回 x 和 y 都包含五个之一的行,因此在本例中为第 1 行和第 3 行。

我试过了:

    df2 <- filter(df, 
             x == ("a" | "c" | "f" | "h" | "k") & 
             y == ("a" | "c" | "f" | "h" | "k"))

但这不适用于因子或字符串。有没有等效的方法或其他方法?

提前致谢。

【问题讨论】:

    标签: r dataframe subset


    【解决方案1】:

    怎么样:

    df2 <- filter(df, grepl("[acfhk]",x) & grepl("[acfhk]",y))
    

    使用dplyr

    【讨论】:

    • 谢谢,这也很好用。实现同一件事的三种不同方法。我有很多东西要学。
    • 不客气。如果您希望处理非常大的数据集,可能值得检查哪个速度最快。
    【解决方案2】:

    dplyr

    df2 <- filter(df, 
                    x %in% c("a" ,"c","f" ,"h","k") & 
                      y %in% c("a" ,"c","f" ,"h","k"))
    df2
      x y z
    1 a h 1
    2 c k 3
    

    【讨论】:

    • 谢谢,这也很好用。所以我的错误是使用 == 而不是 %in%。我对 R 很陌生,所以我以前没有遇到过 %in%。
    • 没问题,是的,%in% 基本上匹配以下向量中的任何字符串。考虑接受上述解决方案之一,这样问题就结束了。
    【解决方案3】:

    我认为这会返回您正在寻找的内容:

    # build vector of necessary elements
    mustHaves <- c("a", "c", "f", "h", "k")
    # perform subsetting
    df[with(df, x %in% mustHaves & y %in% mustHaves),]
      x y z
    1 a h 1
    3 c k 3
    

    数据

    df <- data.frame(x, y, z, stringsAsFactors = FALSE)
    

    【讨论】:

    • 一个完美的答案,而且这么快!非常感谢。
    猜你喜欢
    • 2020-02-25
    • 2014-05-14
    • 1970-01-01
    • 2021-10-09
    • 2019-12-10
    • 2019-09-02
    • 2022-11-22
    • 2018-12-17
    • 2021-10-18
    相关资源
    最近更新 更多