【问题标题】:Filtering Data Frame by using a Dynamic Data Frame使用动态数据框过滤数据框
【发布时间】:2017-01-22 04:02:11
【问题描述】:

我需要通过另一个包含与 df1 相同列名但列数不同的数据框 (df2) 过滤或子集具有 13 个静态列变量的数据框 (df1)。 df2 是用户生成的,包含用户想要过滤 df1 的列。因此 df2 可能只包含一个列名或 8 个列。

df1

V1     V2  V3  V4  V5  V6
Chevy  V8  4D  AT  PS  NAV
Chevy  V8  2D  MT  MS  NONAV

df2

V3   V4  V6
4D   AT  NAV

结果

V1     V2  V3  V4  V5  V6
Chevy  V8  4D  AT  PS  NAV

如何在 R 中做到这一点?子集似乎不是一个好的选择,因为 df2 中的列名是动态的并且总是不同的。所以使用 df2$V3 不是一种选择。

提前致谢。

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以做一个left_join

    library(dplyr)
    left_join(df2, df1) %>%
            select_(.dots = names(df1))
    #     V1 V2 V3 V4 V5  V6
    #1 Chevy V8 4D AT PS NAV
    

    或者使用来自base Rmerge

     merge(df1, df2, all.y= TRUE)[names(df1)]
     #    V1 V2 V3 V4 V5  V6
     #1 Chevy V8 4D AT PS NAV
    

    【讨论】:

      【解决方案2】:

      这正是semi_join 的工作:

      library(dplyr)
      semi_join(df1, df2)
      

      【讨论】:

      • 感谢您的反馈。我只能使用 base R。我没有 dplyr 包,也无法安装它。我可以使用 sqldf 吗?
      • 在这种情况下,使用 merge 修改 akrun 的答案将起作用:merge(df1, df2)[, names(df1), drop = FALSE]
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 2019-06-12
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 2020-11-24
      • 1970-01-01
      相关资源
      最近更新 更多