Поиск строки в кадре данных и изменение значения в ячейке - Rstudio - PullRequest
0 голосов
/ 29 августа 2018

У меня проблема со скриптом в R. У меня есть фрейм данных (CSV) с несколькими сотнями строк в каждом файле. Я хочу сравнить с файлами (более новые с более старыми). В старшем есть определенные значения, такие как Страна, Customer_ID, Категория и Представитель_ID. У каждого клиента есть клиент. И иногда клиент меняет. И изменения есть в каждом файле. Таким образом, самый старый файл (dataframe) является базовой базой данных, в следующем файле есть только изменения. Итак, скажем:

PL|Pharmacy|WPLF1111123233|F111 

, где WPLF1111123233 - идентификатор клиента, а F112 - идентификатор представителя.

в следующем кадре данных есть

PL|Pharmacy|WPLF1111123233|F333

то же самое, что и выше, но тот же представитель изменился с F111 на F333

поэтому я попытался использовать формулу, как это. Проверка идентификатора клиента в первом и втором фреймах данных, а также наличие второго идентификатора ClientID означает, что представитель был изменен, поэтому в первом файле я тоже должен его изменить.

dataset$RepID <- ifelse ((dataset$CustomerID %in% dataset2$CustomerID), dataset2$RepID, dataset$RepID)

где набор данных - это только первый кадр данных, а набор данных2 - это кадр данных с изменениями. «RepID» - столбец с репрезентативным идентификатором. Я использовал Ifelse, потому что обычный If не работает для векторов. Это ложь, потому что у нее нет никакого порядка, и я не знаю, как это опустить. Я искал ответ, но не мог найти ни одного. Спасибо за помощь.

В общем, у меня около 350 файлов, но для этого это будет один простой цикл, так что это не проблема.

EDIT: Старые данные для проверки

D|PL|Terytorium_nowe|WPLF00003224|25|F123|1
D|PL|Terytorium_nowe|WPLF02818905|26|F120|1
I|PL|Terytorium_nowe|WPLF02615545|20|F110|1
I|PL|Terytorium_nowe|WPLF02615553|36|F112|1
I|PL|Terytorium_nowe|WPLF02615557|01|F106|1
I|PL|Terytorium_nowe|WPLF02615561|36|F112|1
I|PL|Terytorium_nowe|WPLF02615564|31|F101|1
I|PL|Terytorium_nowe|WPLF00007731|34|F132|1

ИЗМЕНЕНИЙ:

D|PL|Terytorium_nowe|WPLF07253186|17|Grandpa|1
D|PL|Terytorium_nowe|WPLF00003224|25|Pontiac|1
D|PL|Terytorium_nowe|WPLF02818905|26|Catalina|1
I|PL|Terytorium_nowe|WPLF02615545|20|Chicago|1
I|PL|Terytorium_nowe|WPLF02615557|01|Foxtrot|1
I|PL|Terytorium_nowe|WPLF02615553|36|Tango|1
I|PL|Terytorium_nowe|WPLF02615561|36|Hollywood|1
I|PL|Terytorium_nowe|WPLF02615564|31|Zulu|1 

Таким образом, список из DataToCheck должен быть обновлен -> имена должны быть изменены с F(numbers) на Nato Alphabet и строка с идентификатором WPLF00007731 и ID F132 из DataToCheck не должна быть затронута или изменена, а строка из Changes с Grandpa следует добавить к первому DataToCheck

1 Ответ

0 голосов
/ 29 августа 2018

Решение с базовым циклическим способом. (Измените имена столбцов в соответствии с вашим фреймом данных.)

OLD_DATA_TO_CHECK 

   Col1  Country Category        Customer_Id   Col5 Col6   Col7
1 D     PL      Terytorium_nowe WPLF00003224    25 F123      1
2 D     PL      Terytorium_nowe WPLF02818905    26 F120      1
3 I     PL      Terytorium_nowe WPLF02615545    20 F110      1
4 I     PL      Terytorium_nowe WPLF02615553    36 F112      1
5 I     PL      Terytorium_nowe WPLF02615557     1 F106      1
6 I     PL      Terytorium_nowe WPLF02615561    36 F112      1
7 I     PL      Terytorium_nowe WPLF02615564    31 F101      1
8 I     PL      Terytorium_nowe WPLF00007731    34 F132      1 


CHANGES

    Col1  Country Category        Customer_Id   Col5 Col6       Col7
1 D     PL      Terytorium_nowe WPLF07253186    17 Grandpa       1
2 D     PL      Terytorium_nowe WPLF00003224    25 Pontiac       1
3 D     PL      Terytorium_nowe WPLF02818905    26 Catalina      1
4 I     PL      Terytorium_nowe WPLF02615545    20 Chicago       1
5 I     PL      Terytorium_nowe WPLF02615557     1 Foxtrot       1
6 I     PL      Terytorium_nowe WPLF02615553    36 Tango         1
7 I     PL      Terytorium_nowe WPLF02615561    36 Hollywood     1
8 I     PL      Terytorium_nowe WPLF02615564    31 Zulu          1

Здесь я предполагаю, что OLD_DATA_TO_CHECK - это ваши старые данные, которые должны быть изменены в соответствии с требованиями.

for(i in 1:length(OLD_DATA_TO_CHECK$Customer_Id)){
  for(j in 1:length(CHANGES$Customer_Id)){
    if(OLD_DATA_TO_CHECK$Customer_Id[i] != 'WPLF00007731' & OLD_DATA_TO_CHECK$Col6[i] != "F132"){  # Checking for the row which shold not modify
      if(OLD_DATA_TO_CHECK$Customer_Id[i] == CHANGES$Customer_Id[j]){
        OLD_DATA_TO_CHECK$Col6[i] <- CHANGES$Col6[j]
        if(CHANGES$Col6[i] == 'Grandpa'){
         OLD_DATA_TO_CHECK <- rbind(CHANGES[i,], OLD_DATA_TO_CHECK) # binding the identified row from CHANGES to top row of OLD_DATA_TO_CHECK 
       } 
    }
  }
  }
}

OLD_DATA_TO_CHECK #after modifications

  Col1  Country Category        Customer_Id   Col5 Col6       Col7
1 D     PL      Terytorium_nowe WPLF07253186    17 Grandpa       1
2 D     PL      Terytorium_nowe WPLF00003224    25 Pontiac       1
3 D     PL      Terytorium_nowe WPLF02818905    26 Catalina      1
4 I     PL      Terytorium_nowe WPLF02615545    20 Chicago       1
5 I     PL      Terytorium_nowe WPLF02615553    36 Tango         1
6 I     PL      Terytorium_nowe WPLF02615557     1 Foxtrot       1
7 I     PL      Terytorium_nowe WPLF02615561    36 Hollywood     1
8 I     PL      Terytorium_nowe WPLF02615564    31 Zulu          1
9 I     PL      Terytorium_nowe WPLF00007731    34 F132          1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...