R-另一个数据帧中逐行的子集

时间:2019-10-11 20:42:45

标签: r subset

比方说,我有一个仅包含因子/分类变量的数据框df。我有另一个数据框conditions,其中每一行包含df中某些变量子集的不同因子水平的不同组合(使用expand.gridlevels等制成) 。我正在尝试根据df的每一行来设置conditions子集的方法。因此,例如,如果conditions的列名是c("A", "B", "C"),第一行是c('a1', 'b1', 'c1'),那么我要df[df$A == 'a1' & df$B == 'b1' & df$C == 'c1',],依此类推。

2 个答案:

答案 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参数变得更简单。)