我有一个73335x2882数据帧df,我想根据列df $ rs的因子提取特定行。为了使我的问题易于理解,我创建了一个迷你数据框u。
> rs = c("rs1","rs2","rs3","rs4","rs5")
> m = matrix(c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15),nrow=5)
> u=data.frame(rs,m)
> u
rs X1 X2 X3
1 rs1 1 6 11
2 rs2 2 7 12
3 rs3 3 8 13
4 rs4 4 9 14
5 rs5 5 10 15
现在,我创建了另一个数据框w。
> mat = matrix(c(1,2,3,4,5,6),nrow=2)
> rs = c("rs3","rs5")
> w = data.frame(rs, mat)
> w
rs X1 X2 X3
1 rs3 1 3 5
2 rs5 2 4 6
我想要做的是现在从u中提取u $ rs包含在w $ rs中的所有行。因此,我想获得最终答案:
rs X1 X2 X3
3 rs3 3 8 13
5 rs5 5 10 15
我尝试过以下操作但没有成功:
> u[w$rs,]
rs X1 X2 X3
1 rs1 1 6 11
2 rs2 2 7 12
我也试过
> subset(u, rs == w$rs)
Error in Ops.factor(rs, w$rs) : level sets of factors are different
In addition: Warning message:
In is.na(e1) | is.na(e2) :
longer object length is not a multiple of shorter object length
我知道我可以使用apply(或循环)并验证u $ rs的每个因子是否是w $ rs的元素。但我对此并不满意,因为它会非常缓慢。
有没有人知道如何有效地实现这个目标?
非常感谢。
答案 0 :(得分:2)
你可以尝试,
u[u$rs %in% w$rs, ]
# rs X1 X2 X3
# 3 rs3 3 8 13
# 5 rs5 5 10 15
答案 1 :(得分:1)
或者使用data.table
,我们会转换' u'到' data.table'并加入' rs' ' w' on
' rs'。
library(data.table)#v1.9.6+
setDT(u)[w['rs'], on='rs']
# rs X1 X2 X3
#1: rs3 3 8 13
#2: rs5 5 10 15