我是编程新手,我的问题是匹配或比较两个字符列,如果匹配为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。
答案 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
。例如,您认为条目v2
和v1="1-C2"
匹配吗?
如果您在之后进行部分匹配,则可以使用v2="1-C2_something_else"
标记grepl
中v1
的部分匹配。
例如,使用基础R的v2
和mapply
:
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