使用索引表示法而不是子集使用另一个数据帧过滤data.frame

时间:2014-04-07 17:39:24

标签: r filter dataframe

假设:

df  <- data.frame(rep = letters[sample(4, 30, replace=TRUE)], loc = LETTERS[sample(5:8, 30, replace=TRUE)], y= rnorm(30))

lookup <- data.frame(rep=letters[1:4], loc=LETTERS[5:8])

这会为我提供df中包含lookup中出现的rep,loc组合的行:

mdply(lookup, function(rep,loc){
  r=rep
  l=loc
  subset(df, rep==r & loc==l)
})

但我read由于范围问题,在函数内部使用subset()是不好的做法。那么如何使用索引表示法获得所需的结果呢?

1 个答案:

答案 0 :(得分:1)

在这种特殊情况下,merge似乎对我最有意义:

merge(df, lookup)
#   rep loc          y
# 1   a   E  1.6612394
# 2   a   E  1.1050825
# 3   a   E -0.7016759
# 4   b   F  0.4364568
# 5   d   H  1.3246636
# 6   d   H -2.2573545
# 7   d   H  0.5061980
# 8   d   H  0.1397326

一个简单的替代方案可能是paste来自dflookup的“rep”和“loc”列以及基于此的子集:

df[do.call(paste, df[c("rep", "loc")]) %in% do.call(paste, lookup), ]
#    rep loc          y
# 4    d   H  1.3246636
# 10   b   F  0.4364568
# 14   a   E -0.7016759
# 15   a   E  1.6612394
# 19   d   H  0.5061980
# 20   a   E  1.1050825
# 22   d   H -2.2573545
# 28   d   H  0.1397326