【问题标题】:check if column contains part of another column in r检查列是否包含 r 中另一列的一部分
【发布时间】:2016-05-01 23:58:40
【问题描述】:

我有一个数据框,其中一列中有注册号,另一列中有正确的注册号

a <- c("0c1234", "", "2468O")
b <- c("Oc1234", "Oc5678", "Oc9123")
df <- data.frame(a, b)

我想更新第 1 行,因为它输入不正确,第 2 行是空白的,所以我想更新该字段。第 3 行有一个不同的数字,所以我希望保留这个数字,但是为这一行创建一个新条目(在另一个程序中,我只需要知道它需要插入)。

我如何生成这个数据框?

c <- c("update", "update", "insert")
df2 <- data.frame (a,b,c)

我已经尝试过 grepl 和 str_detect 并且还考虑了使用 grepl 的正则表达式 - 即检查 a 列中的 4 个数字组合是否在 b 列中,但尚未成功

【问题讨论】:

    标签: r string


    【解决方案1】:

    你可以这样做:

    df <- data.frame(a,b,stringsAsFactors = F)
    
    for (i in seq(1,nrow(df))){
        if (df$a[i] == '' || length(agrep(df$a[i],df$b[i])) > 0)
            df$c[i] <- 'update'
        else
            df$c[i] <- 'insert'
    }
    
    df
    
    ##       a      b      c
    ##1 0c1234 Oc1234 update
    ##2        Oc5678 update
    ##3  2468O Oc9123 insert
    

    【讨论】:

    • 谢谢你这样做。你能解释一下双倍的需要吗? |?
    • 如果我删除其中一个 |.错误是“模式”必须是非空字符串
    • @schow 我的坏人。在这种情况下,您必须使用 ||。这背后的真正原因是|用于两个操作数和 || 上的向量仅检查两个操作数上向量的第一个元素。当||应用时,它检查第一个向量的第一个元素,如果为真,则不进行其他条件。但是在 | 的情况下,它首先需要计算两个向量,然后按元素应用 OR 操作。
    【解决方案2】:

    你可以这样做:

    df$c <- ifelse(a == '', 'update', 'insert')
    

    您的输出将如下(您的问题中需要df2):

           a      b      c
    1 0c1234 Oc1234 insert
    2        Oc5678 update
    3  2468O Oc9123 insert
    

    当然,这只有在您的原始数据框具有正确顺序的“事务”时才有效。

    【讨论】:

      猜你喜欢
      • 2020-08-13
      • 2017-01-13
      • 2022-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多