【问题标题】:Removing string out of string rowwise in data.frame using another column in R使用 R 中的另一列从 data.frame 中的字符串中逐行删除字符串
【发布时间】:2016-05-01 19:41:27
【问题描述】:

我正在尝试以逐行方式根据 data.frame 中的另一列从较大的字符串中剪切/删除字符串。

例如,在这个data.frame中col2应该从col1中删除

kat1 <- data.frame(col1 = c("A123Testz45", "66Test255"), col2 = c("Testz", "Test2"))

结果是

          col1     col2
1     A123 45     Testz
2       66 55     Test2

我尝试了sub 的变体

kat1$col1 <- sub(kat1$col2, " ", kat1$col1)

但这会导致

Warning message: In sub(kat1$col2, " ", kat1$col1) : argument 'pattern' has length > 1 and only the first element will be used 

因此,我正在考虑使用 REGEX 中的列以逐行方式替换这些元素的方法。

【问题讨论】:

    标签: regex r dataframe


    【解决方案1】:

    subgsub 无法矢量化 pattern(请参阅 ?gsub)。如果您正在寻找简单性和效率,请尝试stringi(或stringr,这是一个stringi 包装器)

    with(kat1, stringi::stri_replace_all_fixed(col1, col2, " "))
    # [1] "A123 45" "66 55"   
    

    使用基础 R,您可以使用 apply 来(低效地)这样做

    apply(kat1, 1, function(x) sub(x[["col2"]], " ", x[["col1"]], fixed = TRUE))
    # [1] "A123 45" "66 55" 
    

    @docendo 提出的更好的基本 R 建议是在向量上使用 mapply 以避免矩阵转换

    transform(kat1, col1 = mapply(sub, col2, " ", col1, fixed = TRUE))
    #      col1  col2
    # 1 A123 45 Testz
    # 2   66 55 Test2
    

    【讨论】:

    • 我曾经认为stringr 是基本函数的包装器。不是这样吗?
    • @docendodiscimus,不。只需在控制台中输入str_replace_all 并查看源代码。通过“包装器”,我的意思是它只是伪装的相同代码。与用 C/C++ 编写的stringi 相比。
    • stringr 曾经是基本函数的包装器,直到 stringi 出现并大显身手。
    • @DavidArenburg,很有趣!另一个(不是那么有效)基本替代方案是transform(kat1, col1 = mapply(sub, col2, " ", col1))
    • @docendodiscimus 不错的选择。可能比apply
    猜你喜欢
    • 2022-08-16
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多