【问题标题】:An ifelse statement based on grepl [duplicate]基于 grepl 的 ifelse 语句 [重复]
【发布时间】:2016-01-13 12:10:45
【问题描述】:

我有以下数据框:

address <- c("Weg", "Laan", "Molenweg")
b <- seq(1:3)
df <- data.frame(address, b)

我现在想做的是查看地址是否包含某个单词,然后标记一列。像这样:

df_weg <- df$address
x <- c("weg")
df$test <- ifelse(grepl(x, df_weg), 1, 0)

这很好用,但是当单词在列表中时,我正在寻找一种将项目标记为 0/1 的方法。所以它应该像这样工作:

x <- c("weg", "laan")
df$test <- ifelse(grepl(x, df_weg), 1, 0)

但是当我尝试这个时,我得到了以下错误:

Warning message:
In grepl(x, df_weg) :
argument 'pattern' has length > 1 and only the first element will be used

关于如何让这个工作的任何想法?

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以试试下面的表达式:

    x <- "weg|laan" # or paste(c("weg", "laan"), collapse="|")
    df$test <- ifelse(grepl(x, df_weg), 1, 0)
    

    regex 中的| 表示“或”

    作为一种更直接的方式,感谢@DavidArenburg,由于您需要 0/1 输出,您只需将 grepl 的逻辑结果转换为整数:

    as.integer(grepl("weg|laan", df_weg))
    

    或者,如果你想做代码高尔夫(但不太好的做法):

    +grepl("weg|laan", df_weg)
    

    【讨论】:

    • 我们就不能as.integer(grepl("weg|laan", df_weg))吗?或者+ 一元运算符来激怒康拉德?
    • @David 很高兴想到我个人认为它。但实际上我只是在抱怨糟糕的代码。
    • @KonradRudolph 你的即时反应差点从椅子上摔下来。伙计,你真棒。
    • 更严肃地说,上面的问题——就像问题一样——不搜索 word,它搜索任意子字符串。这可能会导致一些意外。因此,如果要搜索单词,应该在模式中使用单词边界标记:'\\b(weg|laan)\\b'
    • @Konrad,我猜,除非weg 用于wegmolenweg... 也可能存在大小写问题(weg 将匹配molenweg 但不匹配@987654335 @,如Q中所写,不确定是故意的...)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    相关资源
    最近更新 更多