下表中有两列我要比较的A
和B
。如果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
在不区分大小写的情况下,所有匹配的输出将为空数据帧。
答案 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