比方说,我有一个仅包含因子/分类变量的数据框df
。我有另一个数据框conditions
,其中每一行包含df
中某些变量子集的不同因子水平的不同组合(使用expand.grid
和levels
等制成) 。我正在尝试根据df
的每一行来设置conditions
子集的方法。因此,例如,如果conditions
的列名是c("A", "B", "C")
,第一行是c('a1', 'b1', 'c1')
,那么我要df[df$A == 'a1' & df$B == 'b1' & df$C == 'c1',]
,依此类推。
答案 0 :(得分:1)
一种选择是使用Reduce
df[Reduce(`&`, Map(`==`, df[c("A", "B", "C")], df[1, c("A", "B", "C")])),]
或者另一个选择是rowSums
df[rowSums(df[c("A", "B", "C")] ==
df[1, c("A", "B", "C")][col(df[c("A", "B", "C")])]) == 3,]
答案 1 :(得分:1)
我认为这是使用div.child:nth-of-type(1)
(或merge
或...)的绝佳时机:
dplyr::*_join
使用df1 <- expand.grid(A = letters[1:4], B = LETTERS[1:4], stringsAsFactors = FALSE)
df1$rn <- seq_len(nrow(df1))
# 'df2' contains the conditions we want to filter (retain)
df2 <- data.frame(
a1 = c('a', 'a', 'c'),
b1 = c('B', 'C', 'C'),
stringsAsFactors = FALSE
)
df1
# A B rn
# 1 a A 1
# 2 b A 2
# 3 c A 3
# 4 d A 4
# 5 a B 5
# 6 b B 6
# 7 c B 7
# 8 d B 8
# 9 a C 9
# 10 b C 10
# 11 c C 11
# 12 d C 12
# 13 a D 13
# 14 b D 14
# 15 c D 15
# 16 d D 16
df2
# a1 b1
# 1 a B
# 2 a C
# 3 c C
定义我们需要保留的组合,
df2
(我用不同的列名定义了merge(df1, df2, by.x=c('A','B'), by.y=c('a1','b1'))
# A B rn
# 1 a B 5
# 2 a C 9
# 3 c C 11
# or
dplyr::inner_join(df1, df2, by=c(A='a1', B='b1'))
只是为了展示它是如何工作的,但是实际上,由于其目的是“仅”是要声明要过滤的组合,因此对我来说有意义的是相同的列名,在这种情况下,df2
参数变得更简单。)