如何删除一列中与第二列不匹配的行?

时间:2012-05-24 08:09:42

标签: r loops if-statement

我有以下问题,我不知道从哪里开始R: 我有两列具有相同的信息,但一列包含一些其他信息。我希望两列完全相同。这是一个例子:

1   1
1   1
2   1
2   2
3   2
3   2
4   2
4   3
5   3
5   3
    4
    4
    4
    5
    5
    5
    5
    5

因此,必须删除第二列中的某些数字,以便两列的长度相等,并且每行中的数字相同。我想有可能构造一个循环并告诉R删除第二列中的数字,直到column1 = column2。 但我不知道从哪里开始。是否有可能R自动读取两列,如果两行不匹配则删除?

2 个答案:

答案 0 :(得分:3)

以面值表示您的问题,这将仅返回第1列==第2列的行,并且还删除带NA的行。如果这不是您期望的输出,请进一步澄清您的问题,最好使用reproducible示例。

> dat <- read.table(text = "1   1
+ 1   1
+ 2   1
+ 2   2
+ 3   2
+ 3   2
+ 4   2
+ 4   3
+ 5   3
+ 5   3
+ NA    4
+ NA    4
+ NA    4
+ NA    5
+ NA    5
+ NA    5
+ NA    5
+ NA    5", header = FALSE)


> dat[dat$V1 == dat$V2 & complete.cases(dat),]
  V1 V2
1  1  1
2  1  1
4  2  2

答案 1 :(得分:0)

首先,让我们制作一些说明问题的R对象:

a <- c(1,1,2,2,3,3,4,4,5,5)
b <- c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,5)

从问题来看,听起来你将它们放在同一个对象中:

c <- cbind(a,b)
  Warning message:
In cbind(a, b) :
  number of rows of result is not a multiple of vector length (arg 1)

但这实际上会将length(b) - length(a)的第一个a元素添加到结尾,以便它与b一样长。

您可以先填写a的缺失值:

 a2 <- append(a, rep(NA, 6) 

现在你可以把它们绑在一起了:

 c <- cbind(a2, b)

但现在听起来你想从b中删除与a不匹配的元素。你提出了一个for循环。但这会变得混乱,并会很快证明手头的任务定义不明确。 while可能更合适,但同样,很快就会变得明显,正如@ user1407656在评论中提到的那样,只需将a的两列绑定在一起就可以获得所需的结果:

 d <- cbind(a,a)