【问题标题】:Finding data frame rows that contain a certain character only once仅查找一次包含某个字符的数据框行
【发布时间】:2020-04-15 14:58:27
【问题描述】:

很抱歉可能会出现重复,但我真的不知道如何提出我的请求。我在 R 上工作,我希望能够识别一次只包含某个字符的数据框单元格。

在我的df 中,我有一列a,其中包含存储为字符串的公式,例如

# a
1 y~x1+x2
2 y~x2+x3
3 y~x1+x2+x3
4 y~x2+x4
5 y~x1+x3+x4

我想保留a 列中的公式有 2 个解释变量的行,即只包含一个“+”。这个想法是过滤并添加一种虚拟对象,例如输出就像

# a b
1 y~x1+x2 1
2 y~x2+x3 1
3 y~x1+x2+x3 0
4 y~x2+x4 1
5 y~x1+x3+x4 0

希望这已经足够清楚了。感谢您的帮助,

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用gsub[^+] 来提取所有+nchar 以获取它们的号码。

    x$b <- +(nchar(gsub("[^+]", "", x$a)) == 1)
    x
    #           a b
    #1    y~x1+x2 1
    #2    y~x2+x3 1
    #3 y~x1+x2+x3 0
    #4    y~x2+x4 1
    #5 y~x1+x3+x4 0
    

    或者使用gregexpr:

    lapply(gregexpr("\\+", x$a), length) == 1
    #[1]  TRUE  TRUE FALSE  TRUE FALSE
    

    或者按照@ThomasIsCoding 的建议将其与lengths 一起使用:

    lengths(gregexpr("\\+", x$a)) == 1
    #[1]  TRUE  TRUE FALSE  TRUE FALSE
    

    或者使用grepl:

    grepl("^[^+]*\\+[^+]*$", x$a)
    #[1]  TRUE  TRUE FALSE  TRUE FALSE
    

    或者strsplit:

    sapply(strsplit(x$a, ""), function(y) sum(y == "+")==1)
    #[1]  TRUE  TRUE FALSE  TRUE FALSE
    

    数据:

    x <- read.table(header=TRUE, text="a
    1  y~x1+x2
    2  y~x2+x3
    3  y~x1+x2+x3
    4  y~x2+x4
    5  y~x1+x3+x4", stringsAsFactors = FALSE)
    

    【讨论】:

    • 很棒的解决方案库! +1
    • 我使用了nchar 解决方案,一切正常,谢谢!
    【解决方案2】:

    另一个基本 R 解决方案是使用gregexpr,即,

    df$b <- +(lengths(gregexpr("\\+",df$a))==1)
    

    这样

    > df
               a b
    1    y~x1+x2 1
    2    y~x2+x3 1
    3 y~x1+x2+x3 0
    4    y~x2+x4 1
    5 y~x1+x3+x4 0
    

    数据

    df <- structure(list(a = c("y~x1+x2", "y~x2+x3", "y~x1+x2+x3", "y~x2+x4", 
    "y~x1+x3+x4")), class = "data.frame", row.names = c("1", "2", 
    "3", "4", "5"))
    

    【讨论】:

      【解决方案3】:

      假设公式中始终存在至少两个预测变量的第三个基础替代方案。

      df$b <- +(!grepl("\\+.*\\+", df$a))
      
      df
                 a b
      1    y~x1+x2 1
      2    y~x2+x3 1
      3 y~x1+x2+x3 0
      4    y~x2+x4 1
      5 y~x1+x3+x4 0
      

      【讨论】:

        猜你喜欢
        • 2018-08-24
        • 1970-01-01
        • 1970-01-01
        • 2022-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-10
        相关资源
        最近更新 更多