【问题标题】:How to delete rows in one column that do not match the second column?如何删除一列中与第二列不匹配的行?
【发布时间】:2012-05-24 08:09:42
【问题描述】:

我有以下问题,我不知道在 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是否有可能自动读取两列并删除?

【问题讨论】:

  • 你能多写一点关于你的问题吗?这些数字是什么?两个独立的向量?你如何创造它们?您不能只复制第一个(帖子中的第一列)并将原始内容合并到一个数组中吗?我真的不明白你的问题的要点。

标签: r loops if-statement


【解决方案1】:

从表面上看您的问题,这将仅返回第 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

【讨论】:

  • @David - 我相信这是在 R2.14.xx 中添加的相对新参数。
【解决方案2】:

首先,让我们制作一些 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)

但这实际上将a的第一个length(b) - length(a)元素添加到末尾,使其与b一样长。

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

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

现在您可以将它们绑定在一起了:

 c <- cbind(a2, b)

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

 d <- cbind(a,a)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多