2017-10-20 73 views
1

我有2列数据,我想确定并计算不匹配的数量。我用:使用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行,因为我想知道是否P * 02:01:01:01和P * 02:01:02:01出现在这两列c和d,我不在乎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 
+3

也许'mapply(函数(X,Y)全部( x == y),lapply(strsplit(y $ c,“[+]”),sort),lapply(strsplit(y $ d,“[+]”),sort))#[1] TRUE TRUE TRUE TRUE TRUE TRUE' – akrun

回答

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") 

首先,我重新创建你的文件然后拆分中间并将另外两列分为“c”和“d”:

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 
+0

很好,谢谢 – Mona

+0

如果两列之间的字符长度不同,则此公式不起作用。例如p * 02:01:01:01 + p * 02:01:01:01 vs p * 02:01:01:01 + p * 02:01:13应该为FALSE,但结果为TRUE。你可以建议对代码进行调整吗? – Mona

+0

是啊......我很害怕那是你想要的。你能提供一个不同的例子组合的例子吗? –