使用R匹配2列的数据

时间:2017-10-20 17:27:12

标签: r

我有2列数据,我想确定并计算不匹配的数量。我用过:

c <-rep ("p*02:01:01:01+p*02:01:02:01", 6)
d <-rep ("p*02:01:02:01+p*02:01:01:01", 6)
y <-data.frame(c,d, stringsAsFactors = F)
y
#                             c                           d
# 1 p*02:01:01:01+p*02:01:02:01 p*02:01:02:01+p*02:01:01:01
# 2 p*02:01:01:01+p*02:01:02:01 p*02:01:02:01+p*02:01:01:01
# 3 p*02:01:01:01+p*02:01:02:01 p*02:01:02:01+p*02:01:01:01
# 4 p*02:01:01:01+p*02:01:02:01 p*02:01:02:01+p*02:01:01:01
# 5 p*02:01:01:01+p*02:01:02:01 p*02:01:02:01+p*02:01:01:01
# 6 p*02:01:01:01+p*02:01:02:01 p*02:01:02:01+p*02:01:01:01

y$c == y$d

# [1] FALSE FALSE FALSE FALSE FALSE FALSE

但是对于所有6行输出应该为TRUE,因为我想知道p + 02:01:01:01和p * 02:01:02:01是否存在于c和d列中,我不知道&# 39;如果p * 02:01:01:01或p * 02:01:02:01在加号之前或之后,请小心。

添加了其他示例的数据框。 mapply公式也只适用于数据帧,但不适用于我导入的csv文件。

  

ý

                        c                            d
1 p*02:01:01:01, p*02:01:02:01 p*02:01:02:01, p*02:01:01:01
2 p*02:01:01:01, p*02:01:02:01 p*02:01:02:01, p*02:01:01:01
3 p*02:01:01:01, p*02:01:02:01 p*02:01:02:01, p*02:01:01:01
4 p*02:01:01:01, p*02:01:02:01 p*02:01:02:01, p*02:01:01:01
5 p*02:01:01:01, p*02:01:02:01 p*02:01:02:01, p*02:01:01:01
6 p*02:01:01:01, p*02:01:02:01 p*02:01:02:01, p*02:01:01:01
7 p*02:01:01:01, p*02:01:01:01    p*02:01:01:01, p*02:01:13
8      p*02:134, p*02:01:01:01    p*02:01:01:01, p*02:01:13
9 p*01:01:01:01, p*02:01:01:01 p*01:01:01:01, p*02:01:01:01 

1 个答案:

答案 0 :(得分:1)

试试这个:

c <-rep ("p*02:01:01:01+p*02:01:02:01", 6)
d <-rep ("p*02:01:02:01+p*02:01:01:01", 6)
y <-data.frame(c,d, stringsAsFactors = F)
y
#                             c                           d
# 1 p*02:01:01:01+p*02:01:02:01 p*02:01:02:01+p*02:01:01:01
# 2 p*02:01:01:01+p*02:01:02:01 p*02:01:02:01+p*02:01:01:01
# 3 p*02:01:01:01+p*02:01:02:01 p*02:01:02:01+p*02:01:01:01
# 4 p*02:01:01:01+p*02:01:02:01 p*02:01:02:01+p*02:01:01:01
# 5 p*02:01:01:01+p*02:01:02:01 p*02:01:02:01+p*02:01:01:01
# 6 p*02:01:01:01+p*02:01:02:01 p*02:01:02:01+p*02:01:01:01


# messed row in y per op comment:

y <- rbind(y, data.frame(c = "p*02:01:01:01+p*02:01:01:01",
                    d = "p*02:01:01:01+p*02:01:13"))

y$c == y$d


library(stringr)

y$c<- stringr::str_split(y$c, "\\+")
y$d<- stringr::str_split(y$d, "\\+")

sapply(seq_along(y$c), function(i) {
  setequal(y$c[[i]], y$d[[i]])
  })

[1] TRUE TRUE TRUE TRUE TRUE TRUE FALSE

要处理已修改帖子中的数据,我可以提出这个问题。

首先,我重新创建了你的文件:

使用来自修改过的问题的示例数据:

testFile <- tempfile()

cat("c                            d
p*02:01:01:01, p*02:01:02:01 p*02:01:02:01, p*02:01:01:01
p*02:01:01:01, p*02:01:02:01 p*02:01:02:01, p*02:01:01:01
p*02:01:01:01, p*02:01:02:01 p*02:01:02:01, p*02:01:01:01
p*02:01:01:01, p*02:01:02:01 p*02:01:02:01, p*02:01:01:01
p*02:01:01:01, p*02:01:02:01 p*02:01:02:01, p*02:01:01:01
p*02:01:01:01, p*02:01:02:01 p*02:01:02:01, p*02:01:01:01
p*02:01:01:01, p*02:01:01:01    p*02:01:01:01, p*02:01:13
p*02:134, p*02:01:01:01 p*02:01:01:01, p*02:01:13
p*01:01:01:01, p*02:01:01:01 p*01:01:01:01, p*02:01:01:01\n",
           file = testFile)

y1 <- read.csv(testFile, skip = 1, header = FALSE, 
               as.is=TRUE)
head(y1)

##              V1                           V2             V3
## 1 p*02:01:01:01  p*02:01:02:01 p*02:01:02:01  p*02:01:01:01
## 2 p*02:01:01:01  p*02:01:02:01 p*02:01:02:01  p*02:01:01:01
## 3 p*02:01:01:01  p*02:01:02:01 p*02:01:02:01  p*02:01:01:01
## 4 p*02:01:01:01  p*02:01:02:01 p*02:01:02:01  p*02:01:01:01
## 5 p*02:01:01:01  p*02:01:02:01 p*02:01:02:01  p*02:01:01:01
## 6 p*02:01:01:01  p*02:01:02:01 p*02:01:02:01  p*02:01:01:01

首先,我将在向量的开头或结尾消除任何空格:

y1[] <- lapply(y1, str_trim, side="both")

然后拆分中间并将另外两列放入&#34; c&#34;和&#34; d&#34; :

y1$c <- cbind(y1$V1, 
              str_split_fixed(y1$V2, pattern = " ", n=2)[,1])
y1$d <- cbind(y1$V3, 
              str_split_fixed(y1$V2, pattern = " ", n=2)[,2])

然后我们将稍微修改原始脚本以在data.frame中使用矩阵:

sapply(seq_along(y1$c[,1]), function(i) {
setequal(y1$c[i,], y1$d[i,])
})

并获得:

## [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE