匹配来自两个数据框的列,并过滤其他列的值

时间:2016-08-04 20:13:46

标签: r for-loop apply

我有两个数据帧,列数相同但行数不同:

colA colB colC colD
xxx  303  200  A
yyy  111  20   B
zzz  24  188   C

我需要将colA中的df1colA中的df2进行匹配,并仅选择df1$colB - df2$colC <= 2000

的行

我尝试进行for循环,但它不起作用:

for (i in nrow(df1)) {
    for (j in nrow(df2)) {
        df3 <- subset(merge(df2[j,], df1[i,], by="row.names", all=T), df2$colA[j] == df1$colA[i] && (df1$colB[i] - df2$colC[j]) <= abs(2000))
    }
}

我做错了什么?它没有给我任何错误,但新的数据帧是空的。

1 个答案:

答案 0 :(得分:0)

如果<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="app.com.thetechnocafe.codelabsmaterialdesign.MainActivity"> <android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"> </android.support.v7.widget.Toolbar> <android.support.design.widget.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content"> </android.support.design.widget.TabLayout> </android.support.design.widget.AppBarLayout> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> </android.support.v4.view.ViewPager> </RelativeLayout> 是一个选项,请尝试以下操作:

dplyr

这将为您提供包含列的框架 df1 %>% inner_join(df2, by = "colA") %>% filter(abs(colB.x - colC.y) <= 2000) 其中.x来自df1,而.y来自df2。 另请注意,colA, colB.x, colC.x, colD.x, colB.y, colC.y, colD.y可能意味着b - a <= abs(2000)