在数据框中查找行并在单元格中更改值-Rstudio

时间:2018-08-29 08:10:04

标签: r dataframe data-analysis

我在R中的脚本有问题。我有一个数据框(CSV),每个文件中都有几百行。我想比较文件(较旧的文件)。在较旧的版本中,有某些值,例如“国家/地区”,“客户ID”,“类别”和“代表ID”。每个客户都有一个客户。有时客户会改变。更改在每个文件中。因此,最旧的文件(数据帧)是基本数据库,在后续文件中,只有更改。因此,让我们说:

PL|Pharmacy|WPLF1111123233|F111 

其中WPLF1111123233是客户ID,而F112是代表ID

在下一个数据帧中

PL|Pharmacy|WPLF1111123233|F333

与上述相同,但同一代表已从F111更改为F333

所以我尝试使用这样的公式。要在第一个数据帧和第二个数据帧中检查客户端的ID,如果在第二个数据帧中存在ClientID,则表示ClientID已更改,因此在第一个文件中我也应对其进行更改。

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

其中数据集只是第一个数据框,而数据集2是具有更改的数据框。 “ RepID”是具有代表ID的列。我使用Ifelse是因为正常的If不适用于矢量。这件事是错误的,因为它没有任何顺序,而且我也不知道该如何省略。我一直在寻找答案,但找不到任何答案。谢谢您的帮助。

一般来说,我喜欢350个文件,但是要做到这一点,它将成为一个简单的循环,所以这不是问题。

编辑: 要检查的旧数据

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,并且不应将DataToCheck中ID为WPLF00007731和ID F132的行被触摸或更改,并且将Grandpa中的更改行添加到第一个DataToCheck

1 个答案:

答案 0 :(得分:0)

具有基本循环方式的解决方案。 (根据您的数据框更改列名称。)

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