比较两个数据帧并根据它们在r中的值过滤值

时间:2017-01-26 08:55:58

标签: r dataframe filter compare

我想比较R中具有相同列名(df1& df2)的两个数据帧。基于其中一列(df2)中每列的值,我想过滤另一列(df1)。我需要消除df1中相对于每个列名称大于或等于df2中的值的行。换句话说,需要在下面生成res1:

df1 <- data.frame( v1 = c(1,2,3,4), v2 = c(2, 10, 5, 11), v3=c(20, 25, 23, 2), v4=c(1,2,1,3) )  

> df1
  v1 v2 v3 v4
1  1  2 20  1
2  2 10 25  2
3  3  5 23  1
4  4 11  2  3

df2 <- data.frame(v1 = 4, v2 = 10, v3 =30, v4 = 3)

> df2
  v1 v2 v3 v4
1  4 10 30 3

因此,通过将df1中的每一行与基于列名的df2进行比较并消除df1中大于或等于df2中定义的特定列阈值的行来生成所需的输出res1:

> res1
  v1 v2 v3 v4
1  1  2 20  1
2  3  5 23  1 

3 个答案:

答案 0 :(得分:3)

我们可以使用带有mapply符号的<来比较两个数据框,并使用rowSums来索引子设置,即

df1[rowSums(mapply(`<`, df1, df2)) == ncol(df1),]
#  v1 v2 v3 v4
#1  1  2 20  1
#3  3  5 23  1

此外,上面的完全矢量化翻译可以是(赞美@RonakShah),

df1[rowSums(df1 < df2[rep(1, nrow(df1)), ]) == ncol(df1), ]

答案 1 :(得分:2)

我们可以逐行使用apply并检查行中的所有元素是否都小于其他数据框中的元素

df1[t(apply(df1, 1, function(x) all(x < df2[1, ]))), ]

#  v1 v2 v3 v4
#1  1  2 20  1
#3  3  5 23  1

答案 2 :(得分:1)

以下是使用 <form action="FormPost" id="form1" runat="server"> <p> Date From: <input type="text" name="DateFrom" id="DateFrom"> </p> <p> Date To: <input type="text"name="DateTo" id="DateTo"> </p> <input type="submit" /> </form> Reduce

的另一个选项
Map

或使用df1[Reduce(`&`, Map(`<`, df1, df2)),] # v1 v2 v3 v4 #1 1 2 20 1 #3 3 5 23 1

tidyverse