【问题标题】:How to subtract a complete character vector with repeated characters from the other vector in R如何从R中的另一个向量中减去具有重复字符的完整字符向量
【发布时间】:2015-03-11 09:36:44
【问题描述】:

我想从 x 中减去 y,这意味着从 x 中删除一个“A”、三个“B”和一个“E”,所以xNew 将是c("A", "C", "A","B","D")。这也意味着

length(xNew)=length(x) - length(y)
x <- c("A","A","C","A","B","B","B","B","D","E")
y <- c("A","B","B","B","E")

setdiff 不起作用,因为

xNew <- setdiff(x,y)
xNew 
[1] "C" "D"

匹配也不行

xNew <- x[-match(y,x)]
xNew
[1] "A" "C" "A" "B" "B" "B" "D"

它删除了第五个位置的“B”3次,所以还剩下三个“B”。

有谁知道如何做到这一点,R中是否有可用的函数或者我们应该编写一个私有函数? 提前非常感谢。

【问题讨论】:

    标签: r vector subset subtraction


    【解决方案1】:

    你可以使用函数pmatch:

    x[-pmatch(y,x)]
    #[1] "A" "C" "A" "B" "D"
    

    编辑
    如果您的数据可以是超过 1 个字符的字符串,这里有一个选项可以得到您想要的:

    xNew <- unlist(sapply(x[!duplicated(x)], 
                          function(item, tab1, tab2) {
                              rep(item,
                                  tab1[item] - ifelse(item %in% names(tab2), tab2[item], 0))
                           }, tab1=table(x), tab2=table(y)))
    

    例子

    x <- c("AB","BA","C","CA","B","B","B","B","D","E")
    y <- c("A","B","B","B","E")
    xNew
    #  AB   BA    C   CA    B    D 
    #"AB" "BA"  "C" "CA"  "B"  "D"
    

    【讨论】:

    • 感谢您的回答。但是当每个字符串的长度大于 1 时 pmatch 是危险的。 x
    • @Jie,但它适用于您提供的示例,该示例仅包含 1 个字符串...(如果您确实可以有超过 1 个字符的字符串,也许您应该编辑您的问题?)
    • @Jie,查看我的编辑,了解超过 1 个字符的字符串的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 2020-09-17
    • 2016-09-15
    • 2015-01-31
    相关资源
    最近更新 更多