2017-07-19 52 views
1

由于intersect不适用于数据框,因此我尝试使用子集创建dfA的子集,仅使用dfA的行名与dfB的行名匹配的数据。因为dfA有5000行,dfB有3000,所以dfB的行名都存在于dfA的行名中。数据框中的行名相交(数据子集)?

以下仅返回dfA的列名称,没有任何数据。

mysubset = subset(dfA, dfA[,0] %in% dfB[,0]) 
+0

'DFA [(以%rownames rownames(DFA)%(DFB))其中,]' – Masoud

+1

' dplyr :: semi_join' –

+0

另外,'R'中没有索引零,索引是从1开始的。 'dfA [,0]'和'dfB [,0]'不存在。 –

回答

0

rownames功能会给您访问rownames,然后设定比较条件会做你期待什么。

实施例,使用小的数据帧具有某些共享rownames

dfA <- data.frame(x = 1:5, 
        y = 6:10, 
        row.names = letters[1:5]) 
# Show dfA 
dfA 
    x y 
a 1 6 
b 2 7 
c 3 8 
d 4 9 
e 5 10 


dfB <- data.frame(x = 1:5, 
        y = 6:10, 
        row.names = letters[3:7]) 

# Show dfB 
dfB 
    x y 
c 1 6 
d 2 7 
e 3 8 
f 4 9 
g 5 10 

# Subset rows with matching rownames 

dfA[ rownames(dfA) %in% rownames(dfB), ] 
    x y 
c 3 8 
d 4 9 
e 5 10 
+0

我选择这个答案,因为它很经济;尽管马苏德的答案也适用。我不知道为什么我忘了所有关于'rownames';我一定非常重视使用'mydf [,0]'。谢谢! – user8121557

1

对于两个data.frames,您应该得到一个基于rownames的子集。

dfA[which(rownames(dfA) %in% rownames(dfB)),] 

此检查从dfA行的名称是在dfBwhich)行的名称,并返回指数来获得dfAdfA[...])的数据。

如果你要坚持你的解决方案(花费多一点,计算):

subset(dfA, rownames(dfA) %in% rownames(dfB))