我想比较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
答案 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