比较两个文本列,并使用新列

时间:2018-04-16 12:01:31

标签: r

我是编程新手,我的问题是匹配或比较两个字符列,如果匹配为True或False则标记。

我的数据框有两个字符列,如下所示

df <- data.frame(v1 = c("1-C2", "2-C1", "2-C2", "1-C1"), 
                 v2 = c("1-C2", "2-C2", "2-C2", "1-C1"))

现在我需要匹配每一行的列,如果匹配则标记为true,否则为false。

3 个答案:

答案 0 :(得分:5)

有很多方法可以做到这一点:

df <- data.frame(v1 = c("1-C2", "2-C1", "2-C2", "1-C1"), 
                 v2 = c("1-C2", "2-C2", "2-C2", "1-C1"), 
                 stringsAsFactors = F)

df$Match <- df$v1 == df$v2

df$Match <- as.character(df$v1) == as.character(df$v2)

当你想在data.frame中保留因子时。

答案 1 :(得分:-1)

我不清楚是否“并且标记匹配”是指相等匹配(这是大多数答案所假设的),或者您是否对列{{1}中的部分匹配条目感兴趣}和v1。例如,您认为条目v2v1="1-C2"匹配吗?

如果您在之后进行部分匹配,则可以使用v2="1-C2_something_else"标记greplv1的部分匹配。

例如,使用基础R的v2mapply

grepl

或者使用mapply(grepl, df$v1, df$v2) #[1] TRUE FALSE TRUE TRUE

purrr::map2_lgl

注意:正如@Gregor指出的那样,如果你是在完全相等匹配之后,我的方法会给出错误的结果,因为条目purrr::map2_lgl(df$v1, df$v2, grepl) #[1] TRUE FALSE TRUE TRUE v1="1-C2"将成功地部分匹配(因为v2="21-C2"包含在1-C2中)。

答案 2 :(得分:-1)

这是另一种方法:

> library(magrittr)
> library(dplyr)
> apply(df,2,function(x) str_sub(x,length(x)-3, 1)) %>% 
    data.frame() %>% mutate(same=(ifelse(v1==v2,TRUE,FALSE)))
  v1 v2 same
1  1  1 TRUE
2  2  2 TRUE
3  2  2 TRUE
4  1  1 TRUE