比较不区分大小写的两列

时间:2019-08-14 22:50:50

标签: r dataframe

下表中有两列我要比较的AB。如果A的值与B中的值不匹配,那么我将保持唯一的ID绑定这两个值,以便跟踪未命中的匹配。

但是,默认情况下,此方法的问题是R区分大小写。有没有可能我可以忽略此特定代码的大小写敏感性?

输入数据

data <- read.table(header = TRUE, text = "A ID  B
                   mA   100 MA
                   ab   101 ab
                   Ca   102 Ca
                   KaK  103 KAK")
A   ID  B
mA  100 MA
ab  101 ab
Ca  102 Ca
KaK 103 KAK

要比较的代码

output <- as.data.frame(data$ID[as.character(data$A) != as.character(data$B)])

输出

ID
100
103

在不区分大小写的情况下,所有匹配的输出将为空数据帧。

3 个答案:

答案 0 :(得分:2)

这是将两列的大小写更改为大写(toupper)或小写(tolower)的一种方法。还要注意下面的子集正确方法。子集单个列时,还需要添加drop = FALSE以保持数据框结构。 -

data[tolower(data$A) != tolower(data$B), "ID", drop = FALSE]

[1] ID
<0 rows> (or 0-length row.names)

答案 1 :(得分:1)

对不起!我无法发表评论,但是有两种方法。使用grep和ignore.case=TRUE或包装在toupper()tolower语句中。

好,有一台笔记本电脑:

dat<-as.data.frame(dat)

dat[]<-lapply(dat,toupper)

#Add ! to return the opposite
> data.frame(ID=dat$ID[dat$A %in% dat$B])
   ID
1 100
2 101
3 102
4 103

答案 2 :(得分:1)

另外两种方法

library(tidyverse)
library(stringr)

my_data <- tribble(~A, ~ID, ~B,
                   'mA',   100, 'MA',
                   'ab',   101, 'ab',
                   'Ca',   102, 'Ca',
                   'KaK',  103, 'KAK',
                   'AA',   104, 'BB',
                   'cd',   105, 'cd',
                   'aa',   106, 'bb')

# returns a vector of IDs
my_data$ID[str_detect(my_data$A, regex(my_data$B, ignore_case = TRUE))]

#[1] 100 101 102 103 105

# Processing and returning a tibble
my_data %>% 
  filter(str_detect(A, regex(B, ignore_case = TRUE))) %>% 
  select(ID)

## A tibble: 5 x 1
#     ID
#  <dbl>
# 1   100
# 2   101
# 3   102
# 4   103
# 5   105