如何在R中简化和概括此子集命令?

时间:2014-01-11 18:36:23

标签: r subset

在分析脚本中,我必须多次执行以下子命令:

subset(df1, A == df2[1,'A'] & V == df2[1,'B'] & C == df2[1,'C'] & D == df2[1,'D'])

R中有没有办法概括这个命令?我希望有类似的东西

classifiers <- c(
  'A',
  'B',
  'C',
  'D'
  )

subset(df1, classifiers == df2[1,classifiers])

3 个答案:

答案 0 :(得分:1)

喜欢这个吗?

#Some data:
set.seed(42)
DF <- as.data.frame(matrix(sample(LETTERS[1:4],400,TRUE),ncol=4))
#e.g., classifiers <- DF2[1, c('A','B')]
classifiers <- c(
  'A',
  'B'
) 

ind <- colSums(t(DF[,c('V1','V2')])==classifiers)==length(classifiers)

DF[ind,]
#   V1 V2 V3 V4
#18  A  B  B  C
#22  A  B  A  B
#43  A  B  A  D
#72  A  B  D  B
#73  A  B  B  D
#75  A  B  D  C

答案 1 :(得分:1)

一种冗长的方法是动态地将子集标准构造为字符串,然后对其进行评估,例如

准备一些数据

df1 <- as.data.frame(replicate(4, sample(1:3, 10, rep=T)))
names(df1) <- LETTERS[1:4]
df2 <- df1

您的方法

subset(df1, A == df2[1,'A'] & B == df2[1,'B'] & C == df2[1,'C'] & D == df2[1,'D'])

  A B C D
1 2 1 1 2

构建子集标准

classifiers <- LETTERS[1:4]
subs <- paste0(classifiers, "== df2[1,'", classifiers, "']", collapse=" & ")
subset(df1, eval(parse(text=subs)))

  A B C D
1 2 1 1 2

paste将标准创建为字符串,即"A== df2[1,'A'] & B== df2[1,'B'] & C== df2[1,'C'] & D== df2[1,'D']"。 eval-parse组合将字符串计算为表达式。

答案 2 :(得分:1)

我会使用merge

merge(df1, df2[1, classifiers])