如何在R / Rstudio中比较数据框

时间:2019-10-23 11:06:19

标签: r

我在一个单独的excel工作簿中有9个工作表(有2个工作簿,首先是最初创建的,其他已复审),我必须将这些工作表与我的审阅者在其中进行过更改的同一审阅工作簿进行比较。

我正在使用以下代码读取整个工作簿,并将其作为工作簿中的工作表传输到单个数据框中

# for reading sheets from the reviewed file

    workbook_new <- lapply(ws_name_new, function(x) read_excel(path = path_new, sheet = x, skip = 2, na = ""))
    workbook_new <- lapply(workbook_new, function(x) x[-2,])
    sheet_list_new <- workbook_new[sapply(workbook_new, function(x) dim(x)[1]) > 0]
# for reading sheets from the originally created file

    workbook_old <- lapply(ws_name_old, function(x) read_excel(path = path_old, sheet = x, skip = 2, na = ""))
    workbook_old <- lapply(workbook_old, function(x) x[-2,])
    sheet_list_old <- workbook_old[sapply(workbook_old, function(x) dim(x)[1]) > 0]

# Below code I am using for the removing the not required sheets
    # for new Workbook
    ws_name_new <- excel_sheets(path = path_new)
    ws_name_new <- ws_name_new[-grep("*_Cal", ws_name_new)]
    ws_name_new <- ws_name_new[-grep("*_cal", ws_name_new)]
    ws_name_new <- ws_name_new[-gre`enter code here`p("*Summary", ws_name_new)]
    ws_name_new <- ws_name_new[-c(1, 9, 16, 17, 18, 19, 20, 21, 22,23,24,25, 26, 27)]

    # For Old file
    ws_name_old <- excel_sheets(path = path_old)
    ws_name_old <- ws_name_old[-grep("*_Cal", ws_name_old)]
    ws_name_old <- ws_name_old[-grep("*_cal", ws_name_old)]
    ws_name_old <- ws_name_old[-grep("*Summary", ws_name_old)]
    ws_name_old <- ws_name_old[-c(1, 9, 16, 17, 18, 19, 20, 21, 22,23,24,25, 26, 27)]

我遵循的方法是首先从excel工作簿中导入每张工作表并创建两个数据框。 df_1_new(来自审阅文件)和df_1_old(来自最初创建的文件)。现在,我想将df_1_new与df_1_old进行比较,并获得最终的差异文件。

我尝试了compare_df()函数,但是它给了我差异文件中的两行,一个是原始行,另一个是被修改的行。我只需要审阅者更改过的那些行。

每个工作簿都有9个数据框,所以总共是18个,我需要比较并获取差异文件。考虑给定的wxaple

示例: 假设我下面有两个数据框。我创建了df_1,而我的审阅者更正了DF_2。现在,由于文件非常大,并且我有超过100列,因此无法一一检查它们。我在寻找解决方案,如果可以比较数据框和最终得到的结果是进行更改的列和行


    key <- c(A1, B1, C1, D1)
    a <- c(10,20,30,40)
    b <- c('book', 'pen', 'textbook', 'pencil_case')
    c <- c(TRUE,FALSE,TRUE,FALSE)
    d <- c(2.5, 8, 10, 7)
    df_1_New <- data.frame(key,a,b,c,d)

    key <- c(A1, B1, C1, D1)
    a <- c(10,5,40,40)
    b <- c('book', 'pen', 'textbook', 'pen_case')
    c <- c(TRUE,FALSE,TRUE,TRUE)
    d <- c(2.5, 3, 10, 7)
    df_1_Old <- data.frame(key, a,b,c,d)

    ctable <- compare_df(df_1_New, df_1_Old, c("Key"), keep_unchanged_cols = FALSE)
    DF_1_Diff <- ctable$comparison_df

    DF_Diff<- DF_1_Diff %>% filter(chng_type == '+') %>%  select(-chng_type)

我只想过滤掉更改,所以我要应用上面的代码并删除'cnge_type'col。我还想从df上删除最后一行,比如说从df中移出10行,我可以在同一行中使用dplyr来做到这一点,这样我就可以使代码更高效。

注意:我还必须执行其他8项相同的任务,并且数据帧的名称紧随df_2_new,df_2_old,df_2_new,df_3_old等,依此类推。

任何人都可以建议我或指导我有效的方法。

0 个答案:

没有答案