比较r中列中的不同id

时间:2014-02-16 23:56:22

标签: r loops

我在df中有一个具有不同id的列。一些id是重复的。我试图比较不同的id(从第一个开始),然后查看列的下一行(行)中是否存在相同的id。如果它是相同的id,那么我做一些事情,如果没有去下一个id并重复相同。这是df

中的列
     V4
Contig1401|m.3412
Contig1428|m.3512
Contig1755|m.4465
Contig1755|m.4465
Contig1897|m.4878
Contig1897|m.4878
Contig1757|m.4476
Contig1598|m.4011
Contig1759|m.4481
Contig1685|m.4244

正如您所看到的,有些ID是重复的而有些则不是。我该怎么做呢?到目前为止,我已经写了这个......

first_id <- "Contig1401|m.3412"

    for (i in data$V4) {
      if (i=first_id) {
        do something.....
      } else {
        do something.
      }
    }

但我不明白我会追求这个。基本上我想获得这个

       V4          V5
Contig1401|m.3412  1
Contig1428|m.3512  1
Contig1755|m.4465  2
Contig1755|m.4465  
Contig1897|m.4878  2
Contig1897|m.4878
Contig1757|m.4476  1
Contig1598|m.4011  1
Contig1759|m.4481  1
Contig1685|m.4244  1

关于我如何做到这一点的任何想法?

由于 众议员

2 个答案:

答案 0 :(得分:3)

不确定这是否符合您的要求,但这会产生您的最终表格

df <- read.table(text="Contig1401|m.3412
Contig1428|m.3512
Contig1755|m.4465
Contig1755|m.4465
Contig1897|m.4878
Contig1897|m.4878
Contig1757|m.4476
Contig1598|m.4011
Contig1759|m.4481
Contig1685|m.4244",header=F,  stringsAsFactors=FALSE)

# One way
df$id <- duplicated(df$V1 , fromLast=T) + 1 
df$id[duplicated(df$V1) ] <- NA

#or
df$id <- rep(rle(df$V1)$lengths,rle(df$V1)$lengths)
df$id[duplicated(df$V1) ] <- NA

答案 1 :(得分:1)

这是一个想法:

dat <- read.table(text="V4
Contig1401|m.3412
Contig1428|m.3512
Contig1755|m.4465
Contig1755|m.4465
Contig1897|m.4878
Contig1897|m.4878
Contig1757|m.4476
Contig1598|m.4011
Contig1759|m.4481",header=T)

# Find entries where the next entry is the same
# Convert TRUE values to be 2 and FALSE values to be 1 by adding +1
same.as.next <- sapply(1:length(dat[,1]),
                function(x)identical(dat[x,],dat[(x+1),]))+1

dat <- data.frame(dat,V5 = same.as.next)

dat[duplicated(dat$V4),]$V5 <- NA

编辑以解决OP关于显示&gt;的条目的评论。 2次

# notice Contig1755|m.4465 shows up 5 times in this example
dat.multduplicates <- read.table(text="V4
Contig1401|m.3412
Contig1428|m.3512
Contig1755|m.4465
Contig1755|m.4465
Contig1755|m.4465
Contig1897|m.4878
Contig1897|m.4878
Contig1757|m.4476
Contig1598|m.4011
Contig1759|m.4481
Contig1755|m.4465
Contig1755|m.4465",header=T)

# same as before
same.as.next <- sapply(1:length(dat.multduplicates[,1]),
            function(x)identical(dat.multduplicates[x,],dat.multduplicates[(x+1),]))+1
dat.multduplicates <- data.frame(dat.multduplicates,V5 = same.as.next)

# this approach should handle the duplicates
dat.multduplicates[which(dat.multduplicates$V5==2)+1,]$V5 <- NA