在一行中查找不相同的条目

时间:2014-08-18 09:32:50

标签: r

我有一个2380行的data.frame,如下所示:

>   nstudentid1 nstudentid2 nstudentid3
1    80501010    80501010    80501010
2    80501022    80501022    80501022
3    80501005    80501005    80501005
4    80501003    80501003    80501003
5    80501026    80501026    80501026
6    80501025    80501025    80501025

正如您所看到的,变量是主题ID。 每个主题都有三个ID用于交叉验证。

通常我们希望在库存中找到重复的条目,我已经这样做了。

现在我想检查每个主题(行)是否在所有三个ID变量中都具有相同的ID号。

我进行了一般检查:

all(student1$nstudentid1 == student1$nstudentid2)
all(student1$nstudentid1 == student1$nstudentid3)
all(student1$nstudentid2 == student1$nstudentid3)

并且得到了FALSE作为答案。

如何找到不相同的行号?

任何建议都会有所帮助

2 个答案:

答案 0 :(得分:1)

将您的条件用作过滤器:

condition <- student1$nstudentid1 == student1$nstudentid2 &
             student1$nstudentid1 == student1$nstudentid3 &
             student1$nstudentid2 == student1$nstudentid3;

nonIdenticalRows <- student1[!condition,]

要获得行号,请执行以下操作:

rowNumbers <- which(!condition)

答案 1 :(得分:1)

 indx <- rowSums(student1==student1[,1])!=ncol(student1)

 student1[indx,]

获取行号,

  which(indx)          
  #  named integer(0) #none of the rows meet the condition

在您的示例中,列是相同的,因此,如果我更改:

  student1[3,3] <- 804015
  indx <- rowSums(student1==student1[,1])!=ncol(student1)
  student1[indx,]
  #nstudentid1 nstudentid2 nstudentid3
  #3    80501005    80501005      804015

解释

  • student1==student1[,1]检查数据集是否等于第一列。基本上,它正在做的是检查te第一列是否等于数据集的每一列。我们获得的输出是:

      nstudentid1 nstudentid2 nstudentid3
    1        TRUE        TRUE        TRUE
    2        TRUE        TRUE        TRUE
    3        TRUE        TRUE        TRUE
    4        TRUE        TRUE        TRUE
    5        TRUE        TRUE        TRUE
    6        TRUE        TRUE        TRUE
    
  • 假设我改变其中一个元素。 student1[3,3] <- 804015,输出为:

      nstudentid1 nstudentid2 nstudentid3
    1        TRUE        TRUE        TRUE
    2        TRUE        TRUE        TRUE
    3        TRUE        TRUE       FALSE
    4        TRUE        TRUE        TRUE
    5        TRUE        TRUE        TRUE
    6        TRUE        TRUE        TRUE
    
  • 执行rowSums(student1==student1[,1])提供

      1 2 3 4 5 6 
      3 3 2 3 3 3 
    
  • 这里,第三行/元素具有较少数量的相同条目。将其等同于数据集的列数。 rowSums(student1==student1[,1])!=ncol(student1)给出了

           1     2     3     4     5     6 
        FALSE FALSE  TRUE FALSE FALSE FALSE 
    

另外,你可以尝试:

  indx1 <- unique(which(student1!=student1[,1],arr.ind=TRUE)[,1])
  student1[indx1,]
  #nstudentid1 nstudentid2 nstudentid3
  #3    80501005    80501005      804015