我将用一个例子说明我的问题:
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)。我搜索了很长一段时间,compare
或data.frame
这些软件包都没有为我工作。
我是R的新手,并且处理了相当大的数据集,所以请帮助我快速运行一个解决方案:)
谢谢!
答案 0 :(得分:0)
发表评论作为答案:
a3 = a1[rownames(a1) %in% rownames(a2), ]
这很简单。我们会查看a1
中的哪些行名称也位于a2
中,我们会保留这些行。无论您的数据是matrix
还是data.frame
。
正如我对其他答案所评论的那样,这也可以被视为内部联接操作。您可以使用base::merge
进行内部联接,或者如果您真的需要使用data.table
或dplyr
个套餐加速。但要使用这些,您需要将矩阵转换为数据框并将行名添加为自己的列。如果您的数据确实在矩阵中,那么仅使用我在上面显示的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