R删除矩阵中与另一个矩阵相比的额外行

时间:2016-08-08 20:39:44

标签: r matrix

我将用一个例子说明我的问题:

a1
#     x y
#Adam 1 a
#Mike 2 b
#Mary 3 c

a2
#     i j
#Adam 4 e
#Mary 5 f

我想要的是这个:

a3    x y
#Adam 1 a
#Mary 3 c

其中a1中的值不会更改,并且a2中未显示的行将被删除(仅限rowname)。我搜索了很长一段时间,comparedata.frame这些软件包都没有为我工作。

我是R的新手,并且处理了相当大的数据集,所以请帮助我快速运行一个解决方案:)

谢谢!

2 个答案:

答案 0 :(得分:0)

发表评论作为答案:

a3 = a1[rownames(a1) %in% rownames(a2), ]

这很简单。我们会查看a1中的哪些行名称也位于a2中,我们会保留这些行。无论您的数据是matrix还是data.frame

,都应该有效

正如我对其他答案所评论的那样,这也可以被视为内部联接操作。您可以使用base::merge进行内部联接,或者如果您真的需要使用data.tabledplyr个套餐加速。但要使用这些,您需要将矩阵转换为数据框并将行名添加为自己的列。如果您的数据确实在矩阵中,那么仅使用我在上面显示的rownames()方法就足够了。

答案 1 :(得分:-1)

编辑答案

dplyr仅适用于data.frames。因此,矩阵必须变为data.frames。您需要向data.frames添加一列以存储来自矩阵的rownames

by语句定义data.frame的哪些公共列匹配记录。

a1 <- matrix(c(1:3, letters[1:3]),
             nrow = 3,
             dimnames = list(c("Adam", "Mike", "Mary"), c("x", "y")))
a2 <- matrix(c(4:5, letters[4:5]),
             nrow = 2,
             dimnames = list(c("Adam", "Mary"), c("x", "y")))

a1_df <- as.data.frame(a1) %>% dplyr::mutate(rnm = rownames(a1))
a1_df
#   x y  rnm
# 1 1 a Adam
# 2 2 b Mike
# 3 3 c Mary

a2_df <- as.data.frame(a2) %>% dplyr::mutate(rnm = rownames(a2))
a2_df
#   x y  rnm
# 1 4 d Adam
# 2 5 e Mary

dplyr::semi_join(a1_df, a2_df, by = "rnm")
#   x y  rnm
# 1 1 a Adam
# 2 3 c Mary

原始答案

您是否使用了anti_join中的dplyr功能?

 ‘anti_join’ return all rows from ‘x’ where there are not matching
      values in ‘y’, keeping just columns from ‘x’.

这是一个例子。根据您在文字中解释的内容,生成的data.frame应该只有#34; Mike&#34;行。

library(dplyr)

a1 <- data.frame(nm = c("Adam", "Mike", "Mary"), x = 1:3, y = letters[1:3])
a2 <- data.frame(nm = c("Adam", "Mary"), x = 4:5, y = letters[4:5])

a1
#     nm x y
# 1 Adam 1 a
# 2 Mike 2 b
# 3 Mary 3 c

a2
#     nm x y
# 1 Adam 4 d
# 2 Mary 5 e

anti_join(a1, a2, by = "nm")
#     nm x y
# 1 Mike 2 b