使用动态数据帧过滤数据帧

时间:2017-01-22 04:02:12

标签: r

我需要对包含13个静态列变量的数据帧(df1)进行过滤或子集,而另一个数据帧(df2)包含与df1相同的列名但不包含相同数量的列。 Df2是用户生成的,包含用户想要过滤df1的列。所以df2可能只包含一个列名或8列。

DF1

using System;
using System.Collections.Generic;
using System.IO;
using CsvHelper;

namespace stack1
{
    class Program
    {
        static void Main(string[] args)
        {
            //list of int
            var result = new List<int>();
            //total 
            int sum=0;
            int recordValue;
            using (TextReader fileReader = File.OpenText(@"C:\sample.csv"))
            {
                var csv = new CsvReader(fileReader);
                csv.Configuration.HasHeaderRecord = false;
                csv.Configuration.TrimFields = false;

                while (csv.Read())
                {
                    for (var i = 0; csv.TryGetField(i, out recordValue); i++)
                    {
                        result.Add(recordValue);
                        sum += recordValue;
                    }
                }
            }
            Console.WriteLine(sum);
            Console.ReadLine();
        }
    }
}

DF2

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

结果

V3   V4  V6
4D   AT  NAV

我怎样才能在R中这样做?由于df2中的列名称是动态的并且总是不同的,因此子集看起来不是一个好选择。所以使用df2 $ V3不是一个选择。

提前致谢。

2 个答案:

答案 0 :(得分:0)

我们可以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

或使用merge

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

答案 1 :(得分:0)

这正是semi_join

的工作
library(dplyr)
semi_join(df1, df2)