Цикл не возвращает совпадающие значения всего объекта столбца из 2 разных файлов в r - PullRequest
0 голосов
/ 20 мая 2019

У меня 2 файла,

1.Файл 1 DDA_File с набором данных из 12 столбцов и 124348 объектов

  1. Справочный лист (Ref_File) с 4 столбцами и 30 объектами, включая заголовок.

Моя цель - найти значение в 12-м столбце DDA_File в 1-м столбце Ref_File. Если совпадение найдено, выберите значение в сравнении со вторым столбцом Ref_File и вставьте его во 2-й столбец DDA_File.

Ссылка Git для ввода данных сэмпла, RS и вывода сэмпла

Я пытался с обходом вложенных циклов через каждый объект файла 1 выбирать совпадения и проверять условия на совпадение.

#Base file for work

DDA_File=read.csv(file_location,header = TRUE)

# Reading reference file to enrich SAP
Ref_File=read.csv(file_location1,header = TRUE)

num_of_rows_DDA <- nrow(DDA_File)
num_of_rows_Ref <- nrow(Ref_File)

#Placeholder for data insertion
output <- data.frame(matrix(data = 0, nrow = num_of_rows_DDA, ncol=2, byrow=T))
no_entry<-data.frame( matrix(data=0) )

#For loop for traversing through each element of DDA file
system.time( for( i in 1:num_of_rows_DDA)
                {
  #For Loop for traversing through each row of Reference Sheet
                 for(j in 1:num_of_rows_Ref)
                    {
    #Condition check
                    if(DDA_File[i,12]==Ref_File[j,1])
                    {
                     output[i,1]<-paste(DDA_File[j,2],"-",Ref_File[j,2])
                     output[i,2]<-Ref_File[j,3]
                     break
                    }
                    else{
                      no_entry<-DDA_File[i,12]
                        }

                    }

})
print("No Match found in reference sheet for :")

Фактический вывод - повторение 6 записей во всех объектах.

                              X1 X2
1      I-DL-DLHI-ENB-A291 - Beta  2
2     I-DL-DLHI-ENB-A291 - Gamma  2
3     I-DL-DLHI-ENB-A291 - Gamma  5
4      I-DL-DLHI-ENB-A291 - Beta  4
5     I-DL-DLHI-ENB-A291 - Gamma  4
6     I-DL-DLHI-ENB-A291 - Alpha  4
7      I-DL-DLHI-ENB-3218 - Beta  6
8     I-DL-DLHI-ENB-A291 - Gamma  3
9     I-DL-DLHI-ENB-A291 - Alpha  2
10    I-DL-DLHI-ENB-3218 - Gamma  6
11    I-DL-DLHI-ENB-3218 - Alpha  1
12     I-DL-DLHI-ENB-3218 - Beta  1
13    I-DL-DLHI-ENB-3218 - Gamma  1
14    I-DL-DLHI-ENB-3218 - Alpha  6
24    I-DL-DLHI-ENB-A291 - Alpha  3
30    I-DL-DLHI-ENB-A291 - Alpha  5
89     I-DL-DLHI-ENB-A291 - Beta  5
94     I-DL-DLHI-ENB-A291 - Beta  3
4440  I-DL-DLHI-ENB-A291 - Gamma  7
9784   I-DL-DLHI-ENB-A291 - Beta  7
15856 I-DL-DLHI-ENB-A291 - Alpha  7

1 Ответ

0 голосов
/ 20 мая 2019

Для будущих постов, пожалуйста, рассмотрите комментарии выше относительно того, что представляет собой «хороший» минимальный и воспроизводимый пример.

Относительно вашего вопроса, как я уже сказал в моем комментарии выше, по сути это простое соединение /слияния;здесь tidydverse опция

library(tidyverse)
DDA_File %>%
    left_join(Ref_File, by = c("cnum" = "Cell.Num")) %>%
    unite(SAP_Sec, NE_NAME.ACCESSIBILITY, Sector, sep = " - ") %>%
    select(SAP_Sec, starts_with("X"))
#                      SAP_Sec X18.Dec.18 X19.Dec.18 X20.Dec.18 X21.Dec.18
#1  I-DL-BADQ-ENB-I001 - Alpha      98.06      95.73      98.66      98.66
#2   I-DL-BADQ-ENB-I001 - Beta      98.06      95.73      98.66      98.66
#3   I-DL-BADQ-ENB-I001 - Beta      45.76      56.54      53.41      67.27
#4  I-DL-BADQ-ENB-I001 - Gamma      45.76      56.54      53.41      67.27
#5  I-DL-BADQ-ENB-I001 - Gamma      93.17      96.37      87.67      89.75
#6  I-DL-BADQ-ENB-I001 - Alpha      93.17      96.37      87.67      89.75
#7  I-DL-BADQ-ENB-I001 - Alpha      98.46      98.42      92.36      97.59
#8   I-DL-BADQ-ENB-I001 - Beta      92.21      98.03      89.21      93.04
#9  I-DL-BADQ-ENB-I001 - Gamma      98.61      96.69      98.64      98.65
#10 I-DL-BADQ-ENB-I001 - Alpha      98.72      97.54      78.89      95.15
#... 

Объяснение: Мы соединяем DDA_File и Ref_File слева, сопоставляя DDA_File$cnum и Ref_File$Cell.Num и объединяя DDA_File$NE_NAME.ACCESSIBILITY с совпадающими значениями Ref_File$Sector;мы наконец выбираем те столбцы, которые вы показываете в ожидаемом результате.


Или то же самое в базе R, используя merge

df.new <- transform(
    merge(DDA_File, Ref_File, by.x = "cnum", by.y = "Cell.Num"),
    SAP_Sec = paste(NE_NAME.ACCESSIBILITY, Sector, sep = " - "))
df.new[, c("SAP_Sec", names(df.new)[grep("^X", names(df.new))])]

Объяснение: На первом шаге мы merge два набора данных и создать новый столбец SAP_Sec;на последнем шаге мы выбираем соответствующие столбцы для воспроизведения ожидаемого результата.


Любой подход должен быть значительно быстрее (и, возможно, что более важно, намного чище), чем подход for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...