R — Есть ли хотя бы одно совпадение между списками, разделенными запятыми?

#r

Вопрос:

Вот данные, с которыми я сейчас работаю:

     structure(list(PortfolioID = c("z036527321", "z036527321", "z036527321", 
"z036526431", "z036526421", "z036526421", "z036526301", "z036525571", 
"z036525571", "z036525571", "z036525391", "z036525391", "z036525391", 
"z036525391", "z036525391", "z036525391", "z036525391", "z036525341", 
"z036525341", "z036524141", "z036524061", "z036523701", "z036523701", 
"z036523701", "z036523701", "z036523701", "z036523701", "z036523701", 
"z036523701", "z036523701", "z036522711", "z036521591", "z036521591", 
"z036521541", "z036521541", "z036521431", "z036521431", "z036521431", 
"z036521431", "z036521431", "z036521431", "z036521431", "z036521431", 
"z036521431", "z036521431", "z036520791", "z036520791", "z036520791", 
"z036520791", "z036520671", "z036520671", "z036520671", "z036520671", 
"z036520671", "z036520051", "z036520041", "z036519831", "z036519831", 
"z036519831", "z036519831", "z036519221", "z036519191", "z036518281", 
"z036518281", "z036517381", "z036516621", "z036516571", "z036516571", 
"z036516571", "z036516571", "z036516571", "z036516571", "z036516571", 
"z036516571", "z036516541", "z036516541", "z036516541", "z036515311", 
"z036515311", "z036515311", "z036515311", "z036515301", "z036515301", 
"z036515301", "z036515301", "z036515301", "z036515301", "z036515301", 
"z036515301", "z036515301", "z036515301", "z036515301", "z036515301", 
"z036515301", "z036515301", "z036515301", "z036515301", "z036515301", 
"z036515301", "z036515301"), `Enterprise Customer Party ID` = c("100600263, 100782628, 100753805, 100770731, 101360754, 103126734", 
"100600263, 100782628, 100753805, 100770731, 101360754, 103126734", 
"100600263, 100782628, 100753805, 100770731, 101360754, 103126734", 
"100175650, 100434367, 100600263, 103507556, 101519578, 103134259, 103134510", 
"100022778, 100570834, 100600263, 103514678, 101514778", "100022778, 100570834, 100600263, 103514678, 101514778", 
"100189878, 100600263, 101199515, 100746736", "101065177, 103502728, 101392726, 101404531", 
"101065177, 103502728, 101392726, 101404531", "101491312, 101404531, 103493687", 
"100363017, 100379794, 100600263, 100616003, 101296443, 103133788", 
"100363017, 100379794, 100600263, 100616003, 101296443", "100363017, 100379794, 100600263, 100616003, 101296443, 103130494", 
"100363017, 100379794, 100600263, 100616003, 101296443, 103130494", 
"100363017, 100379794, 100600263, 100616003, 101296443, 103130494", 
"100379794, 100363017, 100600263, 100616003, 101296443", "100379794, 100363017, 100600263, 100616003, 101296443, 103130494", 
"100175650, 100219612, 100434367, 100600263, 103510210, 103124599", 
"100175650, 100219612, 100600263, 103510210, 103124599, 103124680", 
"100189878, 100386081, 100556993, 100951842, 103521916", "100255427, 100599889, 100600263, 100787593, 101318358, 101466804", 
"100541378, 100600263, 100917340, 100991230", "100600263, 100640734, 100917340, 100991230, 103135413, 103489659", 
"100600263, 100640734, 100917340, 100991230, 103489659", "100600263, 100640734, 100917340, 100991230, 103489659", 
"100541378, 100600263, 100917340, 100991230", "100600263, 100640734, 100917340, 100991230, 103135413, 103489659", 
"100541378, 100600263, 100917340, 100991230", "100600263, 100640734, 100917340, 100991230, 103489659", 
"100600263, 100640734, 100917340, 100991230, 103489659", "100600263, 100987563, 101475026, 101513471, 101558213", 
"100180069, 100600263, 100714430, 101380893", "100180069, 100600263, 100693475, 100714430, 101380893", 
"100600263, 100647941, 100714430, 101497006, 101380893, 103663428", 
"100600263, 100693475, 100714430, 101497006, 101380893", "100513394, 100600263, 101250322, 100888261, 101484512", 
"100513394, 100600263, 101250322, 101488513", "100513394, 100600263, 100680615, 101250322", 
"100513394, 100600263, 100748241, 101250322", "100259186, 100513394, 100600263, 100647941, 101250322", 
"100325289, 100513394, 100600263, 101250322", "100513394, 100600263, 101250322, 101270920", 
"100358051, 100513394, 100600263, 101250322", "100513394, 100600263, 100845917, 101250322", 
"100513394, 100566608, 100600263, 101250322", "100154267, 100219612, 100600263, 101213228, 103498394, 103147666", 
"100154267, 100219612, 100600263, 101213228, 103498394, 103147666", 
"100154267, 100219612, 100600263, 101213228, 103498394, 103147666", 
"100154267, 100219612, 100600263, 101213228, 103498394, 103147666", 
"100386081, 100600263, 100746736, 100856914", "100386081, 100600263, 100746736, 100856914", 
"100386081, 100600263, 100746736, 100856914", "100386081, 100600263, 100746736, 100856914", 
"100386081, 100600263, 100746736, 100856914", "100482176, 100600263, 100615160, 100784263, 101374469", 
"100600263, 101360754, 103124701, 101436015", "100600263, 100655349, 100684621, 100823164, 101254987, 100770731, 100896421", 
"100600263, 100655349, 100684621, 100823164, 101254987, 100896421", 
"100600263, 100655349, 100684621, 100823164, 101254987, 100770731, 100896421", 
"100600263, 100684621, 100655349, 100823164, 101254987, 100770731, 100896421", 
"100513394, 100569469, 100600263, 100693475, 101344508", "100513394, 100600263, 101250322, 103124606, 103143455", 
"100178006, 103513498, 101404531", "100178006, 103513498, 101404531", 
"100532433, 100600263, 100685774, 100787593, 101344508, 103524479", 
"100110952, 100600263, 100879526, 103147348, 103147682, 103147890", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100566667, 100600263, 100603186, 103130050", "100566667, 100600263, 100603186, 103531703, 103128007", 
"100566667, 100600263, 100603186, 103531703, 103128007", "100505868, 100600263, 100879526, 101436015, 103139491, 103482495", 
"100505868, 100600263, 100879526, 103139491, 101436015, 103482495", 
"100505868, 100600263, 100879526, 101436015, 103139491, 103482495", 
"100505868, 100600263, 100879526, 101436015, 103139491, 103482495", 
"100386081, 100600263, 100746736, 103145053", "100386081, 100600263, 101050657, 100746736", 
"100386081, 100600263, 101050657, 100746736", "100386081, 100600263, 100746736, 101050657", 
"100386081, 100600263, 100746736, 103145053", "100386081, 100600263, 100746736, 101381649", 
"100386081, 100600263, 101050657, 100746736", "100386081, 100600263, 100746736, 103145053", 
"100386081, 100600263, 101050657, 100746736", "100386081, 100600263, 100746736, 103145053", 
"100019889, 100386081, 100587086, 100600263, 100746736, 103516226, 103629951, 101540702, 103143165", 
"100386081, 100600263, 100746736, 101381649", "100386081, 100600263, 100746736, 101381649", 
"100386081, 100587086, 100600263, 100746736, 101540702, 103147108", 
"100386081, 100600263, 100746736, 101381649", "100019889, 100386081, 100587086, 100600263, 100746736, 103516226, 103629951, 101540702, 103143165", 
"100386081, 100600263, 100746736, 101381649", "100019889, 100386081, 100587086, 100600263, 100746736, 103516226, 101540702, 103629951, 103143165", 
"100189878, 100386081, 100951842, 101381649")), row.names = c(NA, 
-100L), class = c("tbl_df", "tbl", "data.frame"))
 

Мне нужно знать, есть ли способ узнать, есть ли по крайней мере одно совпадающее значение в столбце B среди всех одинаковых портфолиоидов. Например, для портфолиоида z036527321 мы видим, что среди списков определенно есть одно совпадение (100600263 и множество других). Там будет несколько портфолиоидов, где между ними всеми не будет ни одного совпадения. Все, что мне нужно, — это какой-то индикатор. Поставьте 1, если все портфели имеют одно одинаковое значение, и 0, если нет. Я действительно ценю вашу помощь заранее. Спасибо!

Комментарии:

1. Если есть только один портфель, должен ли он быть TRUE или FALSE тогда?

2. Эй, @Martin Gal, в идеале я бы хотел, чтобы это было просто ПРАВДОЙ, так как ей не с чем сравнивать. Спасибо!

Ответ №1:

После группировки по «ПортфолиоИД» разделите Enterprise Customer Party ID столбец, получите intersect list элементы с reduce , проверьте его length и преобразуйте в логический с is_greater_than

 library(dplyr)
library(purrr)
library(magrittr)
df1 %>% 
    group_by(PortfolioID) %>% 
    mutate(new = reduce(strsplit(`Enterprise Customer Party ID`, 
           ",\s "), intersect) %>%
        length %>%
        is_greater_than(0)) %>%
    ungroup
 

-выход

 # A tibble: 100 x 3
   PortfolioID `Enterprise Customer Party ID`                                              new  
   <chr>       <chr>                                                                       <lgl>
 1 z036527321  100600263, 100782628, 100753805, 100770731, 101360754, 103126734            TRUE 
 2 z036527321  100600263, 100782628, 100753805, 100770731, 101360754, 103126734            TRUE 
 3 z036527321  100600263, 100782628, 100753805, 100770731, 101360754, 103126734            TRUE 
 4 z036526431  100175650, 100434367, 100600263, 103507556, 101519578, 103134259, 103134510 TRUE 
 5 z036526421  100022778, 100570834, 100600263, 103514678, 101514778                       TRUE 
 6 z036526421  100022778, 100570834, 100600263, 103514678, 101514778                       TRUE 
 7 z036526301  100189878, 100600263, 101199515, 100746736                                  TRUE 
 8 z036525571  101065177, 103502728, 101392726, 101404531                                  TRUE 
 9 z036525571  101065177, 103502728, 101392726, 101404531                                  TRUE 
10 z036525571  101491312, 101404531, 103493687                                             TRUE 
# … with 90 more rows
 

Комментарии:

1. Это было здорово @akrun, большое вам спасибо за всю вашу помощь. Я действительно ценю это

Ответ №2:

Вы могли бы использовать

 library(stringr)
library(dplyr)
library(tidyr)

data %>% 
  add_count(PortfolioID) %>%
  mutate(`Enterprise Customer Party ID` = str_split(`Enterprise Customer Party ID`, ", ")) %>% 
  unnest(`Enterprise Customer Party ID`) %>% 
  group_by(PortfolioID) %>%
  add_count(`Enterprise Customer Party ID`) %>% 
  summarise(match = any(n == nn)) %>% 
  right_join(data, by = "PortfolioID")
 

который возвращает

 # A tibble: 100 x 3
   PortfolioID match `Enterprise Customer Party ID`            
   <chr>       <lgl> <chr>                                     
 1 z036515301  TRUE  100386081, 100600263, 100746736, 103145053
 2 z036515301  TRUE  100386081, 100600263, 101050657, 100746736
 3 z036515301  TRUE  100386081, 100600263, 101050657, 100746736
 4 z036515301  TRUE  100386081, 100600263, 100746736, 101050657
 5 z036515301  TRUE  100386081, 100600263, 100746736, 103145053
 6 z036515301  TRUE  100386081, 100600263, 100746736, 101381649
 7 z036515301  TRUE  100386081, 100600263, 101050657, 100746736
 8 z036515301  TRUE  100386081, 100600263, 100746736, 103145053
 9 z036515301  TRUE  100386081, 100600263, 101050657, 100746736
10 z036515301  TRUE  100386081, 100600263, 100746736, 103145053
# ... with 90 more rows
 

Комментарии:

1. Это сработало идеально и быстро, большое спасибо @Martin Gal

Ответ №3:

Я скопировал предоставленные вами данные в фрейм данных под названием foo .

В этом решении создается новый столбец (называемый «any_match»), который показывает TRUE , есть ли повторяющиеся идентификаторы корпоративных клиентов для одного и того же портфолио. Он возвращает a FALSE , если дубликатов нет.

Единственные случаи FALSE , которые появляются в этом решении, — это когда для портфолиоида есть только 1 строка. Таким образом, очевидно, что дубликатов не будет, потому что существует только 1 экземпляр портфолиоида.

 library(tidyverse)

foo %>%
  split(foo$PortfolioID) %>%
  map_dfr(function(pID) {
    
    pID_ecpid <- str_split(pID
 #r



Вопрос:

Вот данные, с которыми я сейчас работаю:
     structure(list(PortfolioID = c("z036527321", "z036527321", "z036527321", 
"z036526431", "z036526421", "z036526421", "z036526301", "z036525571", 
"z036525571", "z036525571", "z036525391", "z036525391", "z036525391", 
"z036525391", "z036525391", "z036525391", "z036525391", "z036525341", 
"z036525341", "z036524141", "z036524061", "z036523701", "z036523701", 
"z036523701", "z036523701", "z036523701", "z036523701", "z036523701", 
"z036523701", "z036523701", "z036522711", "z036521591", "z036521591", 
"z036521541", "z036521541", "z036521431", "z036521431", "z036521431", 
"z036521431", "z036521431", "z036521431", "z036521431", "z036521431", 
"z036521431", "z036521431", "z036520791", "z036520791", "z036520791", 
"z036520791", "z036520671", "z036520671", "z036520671", "z036520671", 
"z036520671", "z036520051", "z036520041", "z036519831", "z036519831", 
"z036519831", "z036519831", "z036519221", "z036519191", "z036518281", 
"z036518281", "z036517381", "z036516621", "z036516571", "z036516571", 
"z036516571", "z036516571", "z036516571", "z036516571", "z036516571", 
"z036516571", "z036516541", "z036516541", "z036516541", "z036515311", 
"z036515311", "z036515311", "z036515311", "z036515301", "z036515301", 
"z036515301", "z036515301", "z036515301", "z036515301", "z036515301", 
"z036515301", "z036515301", "z036515301", "z036515301", "z036515301", 
"z036515301", "z036515301", "z036515301", "z036515301", "z036515301", 
"z036515301", "z036515301"), `Enterprise Customer Party ID` = c("100600263, 100782628, 100753805, 100770731, 101360754, 103126734", 
"100600263, 100782628, 100753805, 100770731, 101360754, 103126734", 
"100600263, 100782628, 100753805, 100770731, 101360754, 103126734", 
"100175650, 100434367, 100600263, 103507556, 101519578, 103134259, 103134510", 
"100022778, 100570834, 100600263, 103514678, 101514778", "100022778, 100570834, 100600263, 103514678, 101514778", 
"100189878, 100600263, 101199515, 100746736", "101065177, 103502728, 101392726, 101404531", 
"101065177, 103502728, 101392726, 101404531", "101491312, 101404531, 103493687", 
"100363017, 100379794, 100600263, 100616003, 101296443, 103133788", 
"100363017, 100379794, 100600263, 100616003, 101296443", "100363017, 100379794, 100600263, 100616003, 101296443, 103130494", 
"100363017, 100379794, 100600263, 100616003, 101296443, 103130494", 
"100363017, 100379794, 100600263, 100616003, 101296443, 103130494", 
"100379794, 100363017, 100600263, 100616003, 101296443", "100379794, 100363017, 100600263, 100616003, 101296443, 103130494", 
"100175650, 100219612, 100434367, 100600263, 103510210, 103124599", 
"100175650, 100219612, 100600263, 103510210, 103124599, 103124680", 
"100189878, 100386081, 100556993, 100951842, 103521916", "100255427, 100599889, 100600263, 100787593, 101318358, 101466804", 
"100541378, 100600263, 100917340, 100991230", "100600263, 100640734, 100917340, 100991230, 103135413, 103489659", 
"100600263, 100640734, 100917340, 100991230, 103489659", "100600263, 100640734, 100917340, 100991230, 103489659", 
"100541378, 100600263, 100917340, 100991230", "100600263, 100640734, 100917340, 100991230, 103135413, 103489659", 
"100541378, 100600263, 100917340, 100991230", "100600263, 100640734, 100917340, 100991230, 103489659", 
"100600263, 100640734, 100917340, 100991230, 103489659", "100600263, 100987563, 101475026, 101513471, 101558213", 
"100180069, 100600263, 100714430, 101380893", "100180069, 100600263, 100693475, 100714430, 101380893", 
"100600263, 100647941, 100714430, 101497006, 101380893, 103663428", 
"100600263, 100693475, 100714430, 101497006, 101380893", "100513394, 100600263, 101250322, 100888261, 101484512", 
"100513394, 100600263, 101250322, 101488513", "100513394, 100600263, 100680615, 101250322", 
"100513394, 100600263, 100748241, 101250322", "100259186, 100513394, 100600263, 100647941, 101250322", 
"100325289, 100513394, 100600263, 101250322", "100513394, 100600263, 101250322, 101270920", 
"100358051, 100513394, 100600263, 101250322", "100513394, 100600263, 100845917, 101250322", 
"100513394, 100566608, 100600263, 101250322", "100154267, 100219612, 100600263, 101213228, 103498394, 103147666", 
"100154267, 100219612, 100600263, 101213228, 103498394, 103147666", 
"100154267, 100219612, 100600263, 101213228, 103498394, 103147666", 
"100154267, 100219612, 100600263, 101213228, 103498394, 103147666", 
"100386081, 100600263, 100746736, 100856914", "100386081, 100600263, 100746736, 100856914", 
"100386081, 100600263, 100746736, 100856914", "100386081, 100600263, 100746736, 100856914", 
"100386081, 100600263, 100746736, 100856914", "100482176, 100600263, 100615160, 100784263, 101374469", 
"100600263, 101360754, 103124701, 101436015", "100600263, 100655349, 100684621, 100823164, 101254987, 100770731, 100896421", 
"100600263, 100655349, 100684621, 100823164, 101254987, 100896421", 
"100600263, 100655349, 100684621, 100823164, 101254987, 100770731, 100896421", 
"100600263, 100684621, 100655349, 100823164, 101254987, 100770731, 100896421", 
"100513394, 100569469, 100600263, 100693475, 101344508", "100513394, 100600263, 101250322, 103124606, 103143455", 
"100178006, 103513498, 101404531", "100178006, 103513498, 101404531", 
"100532433, 100600263, 100685774, 100787593, 101344508, 103524479", 
"100110952, 100600263, 100879526, 103147348, 103147682, 103147890", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100566667, 100600263, 100603186, 103130050", "100566667, 100600263, 100603186, 103531703, 103128007", 
"100566667, 100600263, 100603186, 103531703, 103128007", "100505868, 100600263, 100879526, 101436015, 103139491, 103482495", 
"100505868, 100600263, 100879526, 103139491, 101436015, 103482495", 
"100505868, 100600263, 100879526, 101436015, 103139491, 103482495", 
"100505868, 100600263, 100879526, 101436015, 103139491, 103482495", 
"100386081, 100600263, 100746736, 103145053", "100386081, 100600263, 101050657, 100746736", 
"100386081, 100600263, 101050657, 100746736", "100386081, 100600263, 100746736, 101050657", 
"100386081, 100600263, 100746736, 103145053", "100386081, 100600263, 100746736, 101381649", 
"100386081, 100600263, 101050657, 100746736", "100386081, 100600263, 100746736, 103145053", 
"100386081, 100600263, 101050657, 100746736", "100386081, 100600263, 100746736, 103145053", 
"100019889, 100386081, 100587086, 100600263, 100746736, 103516226, 103629951, 101540702, 103143165", 
"100386081, 100600263, 100746736, 101381649", "100386081, 100600263, 100746736, 101381649", 
"100386081, 100587086, 100600263, 100746736, 101540702, 103147108", 
"100386081, 100600263, 100746736, 101381649", "100019889, 100386081, 100587086, 100600263, 100746736, 103516226, 103629951, 101540702, 103143165", 
"100386081, 100600263, 100746736, 101381649", "100019889, 100386081, 100587086, 100600263, 100746736, 103516226, 101540702, 103629951, 103143165", 
"100189878, 100386081, 100951842, 101381649")), row.names = c(NA, 
-100L), class = c("tbl_df", "tbl", "data.frame"))
 

Мне нужно знать, есть ли способ узнать, есть ли по крайней мере одно совпадающее значение в столбце B среди всех одинаковых портфолиоидов. Например, для портфолиоида z036527321 мы видим, что среди списков определенно есть одно совпадение (100600263 и множество других). Там будет несколько портфолиоидов, где между ними всеми не будет ни одного совпадения. Все, что мне нужно, - это какой-то индикатор. Поставьте 1, если все портфели имеют одно одинаковое значение, и 0, если нет. Я действительно ценю вашу помощь заранее. Спасибо!

Комментарии:

1. Если есть только один портфель, должен ли он быть TRUE или FALSE тогда?

2. Эй, @Martin Gal, в идеале я бы хотел, чтобы это было просто ПРАВДОЙ, так как ей не с чем сравнивать. Спасибо!

Ответ №1:

После группировки по "ПортфолиоИД" разделите Enterprise Customer Party ID столбец, получите intersect list элементы с reduce , проверьте его length и преобразуйте в логический с is_greater_than

 library(dplyr)
library(purrr)
library(magrittr)
df1 %>% 
    group_by(PortfolioID) %>% 
    mutate(new = reduce(strsplit(`Enterprise Customer Party ID`, 
           ",\s "), intersect) %>%
        length %>%
        is_greater_than(0)) %>%
    ungroup
 

-выход

 # A tibble: 100 x 3
   PortfolioID `Enterprise Customer Party ID`                                              new  
   <chr>       <chr>                                                                       <lgl>
 1 z036527321  100600263, 100782628, 100753805, 100770731, 101360754, 103126734            TRUE 
 2 z036527321  100600263, 100782628, 100753805, 100770731, 101360754, 103126734            TRUE 
 3 z036527321  100600263, 100782628, 100753805, 100770731, 101360754, 103126734            TRUE 
 4 z036526431  100175650, 100434367, 100600263, 103507556, 101519578, 103134259, 103134510 TRUE 
 5 z036526421  100022778, 100570834, 100600263, 103514678, 101514778                       TRUE 
 6 z036526421  100022778, 100570834, 100600263, 103514678, 101514778                       TRUE 
 7 z036526301  100189878, 100600263, 101199515, 100746736                                  TRUE 
 8 z036525571  101065177, 103502728, 101392726, 101404531                                  TRUE 
 9 z036525571  101065177, 103502728, 101392726, 101404531                                  TRUE 
10 z036525571  101491312, 101404531, 103493687                                             TRUE 
# … with 90 more rows
 

Комментарии:

1. Это было здорово @akrun, большое вам спасибо за всю вашу помощь. Я действительно ценю это

Ответ №2:

Вы могли бы использовать

 library(stringr)
library(dplyr)
library(tidyr)

data %>% 
  add_count(PortfolioID) %>%
  mutate(`Enterprise Customer Party ID` = str_split(`Enterprise Customer Party ID`, ", ")) %>% 
  unnest(`Enterprise Customer Party ID`) %>% 
  group_by(PortfolioID) %>%
  add_count(`Enterprise Customer Party ID`) %>% 
  summarise(match = any(n == nn)) %>% 
  right_join(data, by = "PortfolioID")
 

который возвращает

 # A tibble: 100 x 3
   PortfolioID match `Enterprise Customer Party ID`            
   <chr>       <lgl> <chr>                                     
 1 z036515301  TRUE  100386081, 100600263, 100746736, 103145053
 2 z036515301  TRUE  100386081, 100600263, 101050657, 100746736
 3 z036515301  TRUE  100386081, 100600263, 101050657, 100746736
 4 z036515301  TRUE  100386081, 100600263, 100746736, 101050657
 5 z036515301  TRUE  100386081, 100600263, 100746736, 103145053
 6 z036515301  TRUE  100386081, 100600263, 100746736, 101381649
 7 z036515301  TRUE  100386081, 100600263, 101050657, 100746736
 8 z036515301  TRUE  100386081, 100600263, 100746736, 103145053
 9 z036515301  TRUE  100386081, 100600263, 101050657, 100746736
10 z036515301  TRUE  100386081, 100600263, 100746736, 103145053
# ... with 90 more rows
 

Комментарии:

1. Это сработало идеально и быстро, большое спасибо @Martin Gal

Ответ №3:

Я скопировал предоставленные вами данные в фрейм данных под названием foo .

В этом решении создается новый столбец (называемый "any_match"), который показывает TRUE , есть ли повторяющиеся идентификаторы корпоративных клиентов для одного и того же портфолио. Он возвращает a FALSE , если дубликатов нет.

Единственные случаи FALSE , которые появляются в этом решении, - это когда для портфолиоида есть только 1 строка. Таким образом, очевидно, что дубликатов не будет, потому что существует только 1 экземпляр портфолиоида.

Enterprise Customer Party ID`, ', ')

match_check <- rep(NA, length(pID_ecpid))

for (i in 1:length(pID_ecpid)) {
check_with <- pID_ecpid[[i]]
check_against <- unlist(pID_ecpid[-i])
match_check[i] <- any(check_with %in% check_against)
}

pID <- pID %>%
mutate(any_match = all(match_check))

return(pID)

})

Комментарии:

1. Это действительно близко к тому, что мне нужно, большое вам спасибо за вашу помощь. Мне действительно нужно это, чтобы проверить и убедиться, что в каждом экземпляре портфолиоида есть тот, который соответствует. Я думаю, что ваш код ищет, есть ли хотя бы 1 дубликат для данного портфолиоида. Например, если в портфолио 5 строк, мне нужно знать, есть ли во всех 5 строках хотя бы одна совпадающая. Если не у всех 5 есть один, который совпадает, то FALSE, а если все они совпадают, то TRUE. @Харрисон Джонс

2. Внес некоторые правки. Попробуйте эту версию и посмотрите, исправит ли она проблему. У вас есть пример портфолиоида, где это происходит? Я не могу найти ни одного.

3. В итоге все получилось отлично, просто потребовалось много времени, чтобы закончить. @Харрисон Джонс, большое вам спасибо за вашу помощь!

Ответ №4:

Основание R

 # Function to split the strings into a vector:
# strsplit_to_vec => function() 
strsplit_to_vec <- function(vec, pattern){
  return(unlist(strsplit(vec, pattern)))
}

# Apply the function on each element of the 
# multi-valued attribute Enterprise Customer Party ID
# grouped by PortfolioId: 
# split_str_list => list of character vectors
split_str_list <- lapply(
  split(
    df
 #r



Вопрос:

Вот данные, с которыми я сейчас работаю:
     structure(list(PortfolioID = c("z036527321", "z036527321", "z036527321", 
"z036526431", "z036526421", "z036526421", "z036526301", "z036525571", 
"z036525571", "z036525571", "z036525391", "z036525391", "z036525391", 
"z036525391", "z036525391", "z036525391", "z036525391", "z036525341", 
"z036525341", "z036524141", "z036524061", "z036523701", "z036523701", 
"z036523701", "z036523701", "z036523701", "z036523701", "z036523701", 
"z036523701", "z036523701", "z036522711", "z036521591", "z036521591", 
"z036521541", "z036521541", "z036521431", "z036521431", "z036521431", 
"z036521431", "z036521431", "z036521431", "z036521431", "z036521431", 
"z036521431", "z036521431", "z036520791", "z036520791", "z036520791", 
"z036520791", "z036520671", "z036520671", "z036520671", "z036520671", 
"z036520671", "z036520051", "z036520041", "z036519831", "z036519831", 
"z036519831", "z036519831", "z036519221", "z036519191", "z036518281", 
"z036518281", "z036517381", "z036516621", "z036516571", "z036516571", 
"z036516571", "z036516571", "z036516571", "z036516571", "z036516571", 
"z036516571", "z036516541", "z036516541", "z036516541", "z036515311", 
"z036515311", "z036515311", "z036515311", "z036515301", "z036515301", 
"z036515301", "z036515301", "z036515301", "z036515301", "z036515301", 
"z036515301", "z036515301", "z036515301", "z036515301", "z036515301", 
"z036515301", "z036515301", "z036515301", "z036515301", "z036515301", 
"z036515301", "z036515301"), `Enterprise Customer Party ID` = c("100600263, 100782628, 100753805, 100770731, 101360754, 103126734", 
"100600263, 100782628, 100753805, 100770731, 101360754, 103126734", 
"100600263, 100782628, 100753805, 100770731, 101360754, 103126734", 
"100175650, 100434367, 100600263, 103507556, 101519578, 103134259, 103134510", 
"100022778, 100570834, 100600263, 103514678, 101514778", "100022778, 100570834, 100600263, 103514678, 101514778", 
"100189878, 100600263, 101199515, 100746736", "101065177, 103502728, 101392726, 101404531", 
"101065177, 103502728, 101392726, 101404531", "101491312, 101404531, 103493687", 
"100363017, 100379794, 100600263, 100616003, 101296443, 103133788", 
"100363017, 100379794, 100600263, 100616003, 101296443", "100363017, 100379794, 100600263, 100616003, 101296443, 103130494", 
"100363017, 100379794, 100600263, 100616003, 101296443, 103130494", 
"100363017, 100379794, 100600263, 100616003, 101296443, 103130494", 
"100379794, 100363017, 100600263, 100616003, 101296443", "100379794, 100363017, 100600263, 100616003, 101296443, 103130494", 
"100175650, 100219612, 100434367, 100600263, 103510210, 103124599", 
"100175650, 100219612, 100600263, 103510210, 103124599, 103124680", 
"100189878, 100386081, 100556993, 100951842, 103521916", "100255427, 100599889, 100600263, 100787593, 101318358, 101466804", 
"100541378, 100600263, 100917340, 100991230", "100600263, 100640734, 100917340, 100991230, 103135413, 103489659", 
"100600263, 100640734, 100917340, 100991230, 103489659", "100600263, 100640734, 100917340, 100991230, 103489659", 
"100541378, 100600263, 100917340, 100991230", "100600263, 100640734, 100917340, 100991230, 103135413, 103489659", 
"100541378, 100600263, 100917340, 100991230", "100600263, 100640734, 100917340, 100991230, 103489659", 
"100600263, 100640734, 100917340, 100991230, 103489659", "100600263, 100987563, 101475026, 101513471, 101558213", 
"100180069, 100600263, 100714430, 101380893", "100180069, 100600263, 100693475, 100714430, 101380893", 
"100600263, 100647941, 100714430, 101497006, 101380893, 103663428", 
"100600263, 100693475, 100714430, 101497006, 101380893", "100513394, 100600263, 101250322, 100888261, 101484512", 
"100513394, 100600263, 101250322, 101488513", "100513394, 100600263, 100680615, 101250322", 
"100513394, 100600263, 100748241, 101250322", "100259186, 100513394, 100600263, 100647941, 101250322", 
"100325289, 100513394, 100600263, 101250322", "100513394, 100600263, 101250322, 101270920", 
"100358051, 100513394, 100600263, 101250322", "100513394, 100600263, 100845917, 101250322", 
"100513394, 100566608, 100600263, 101250322", "100154267, 100219612, 100600263, 101213228, 103498394, 103147666", 
"100154267, 100219612, 100600263, 101213228, 103498394, 103147666", 
"100154267, 100219612, 100600263, 101213228, 103498394, 103147666", 
"100154267, 100219612, 100600263, 101213228, 103498394, 103147666", 
"100386081, 100600263, 100746736, 100856914", "100386081, 100600263, 100746736, 100856914", 
"100386081, 100600263, 100746736, 100856914", "100386081, 100600263, 100746736, 100856914", 
"100386081, 100600263, 100746736, 100856914", "100482176, 100600263, 100615160, 100784263, 101374469", 
"100600263, 101360754, 103124701, 101436015", "100600263, 100655349, 100684621, 100823164, 101254987, 100770731, 100896421", 
"100600263, 100655349, 100684621, 100823164, 101254987, 100896421", 
"100600263, 100655349, 100684621, 100823164, 101254987, 100770731, 100896421", 
"100600263, 100684621, 100655349, 100823164, 101254987, 100770731, 100896421", 
"100513394, 100569469, 100600263, 100693475, 101344508", "100513394, 100600263, 101250322, 103124606, 103143455", 
"100178006, 103513498, 101404531", "100178006, 103513498, 101404531", 
"100532433, 100600263, 100685774, 100787593, 101344508, 103524479", 
"100110952, 100600263, 100879526, 103147348, 103147682, 103147890", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100566667, 100600263, 100603186, 103130050", "100566667, 100600263, 100603186, 103531703, 103128007", 
"100566667, 100600263, 100603186, 103531703, 103128007", "100505868, 100600263, 100879526, 101436015, 103139491, 103482495", 
"100505868, 100600263, 100879526, 103139491, 101436015, 103482495", 
"100505868, 100600263, 100879526, 101436015, 103139491, 103482495", 
"100505868, 100600263, 100879526, 101436015, 103139491, 103482495", 
"100386081, 100600263, 100746736, 103145053", "100386081, 100600263, 101050657, 100746736", 
"100386081, 100600263, 101050657, 100746736", "100386081, 100600263, 100746736, 101050657", 
"100386081, 100600263, 100746736, 103145053", "100386081, 100600263, 100746736, 101381649", 
"100386081, 100600263, 101050657, 100746736", "100386081, 100600263, 100746736, 103145053", 
"100386081, 100600263, 101050657, 100746736", "100386081, 100600263, 100746736, 103145053", 
"100019889, 100386081, 100587086, 100600263, 100746736, 103516226, 103629951, 101540702, 103143165", 
"100386081, 100600263, 100746736, 101381649", "100386081, 100600263, 100746736, 101381649", 
"100386081, 100587086, 100600263, 100746736, 101540702, 103147108", 
"100386081, 100600263, 100746736, 101381649", "100019889, 100386081, 100587086, 100600263, 100746736, 103516226, 103629951, 101540702, 103143165", 
"100386081, 100600263, 100746736, 101381649", "100019889, 100386081, 100587086, 100600263, 100746736, 103516226, 101540702, 103629951, 103143165", 
"100189878, 100386081, 100951842, 101381649")), row.names = c(NA, 
-100L), class = c("tbl_df", "tbl", "data.frame"))
 

Мне нужно знать, есть ли способ узнать, есть ли по крайней мере одно совпадающее значение в столбце B среди всех одинаковых портфолиоидов. Например, для портфолиоида z036527321 мы видим, что среди списков определенно есть одно совпадение (100600263 и множество других). Там будет несколько портфолиоидов, где между ними всеми не будет ни одного совпадения. Все, что мне нужно, - это какой-то индикатор. Поставьте 1, если все портфели имеют одно одинаковое значение, и 0, если нет. Я действительно ценю вашу помощь заранее. Спасибо!

Комментарии:

1. Если есть только один портфель, должен ли он быть TRUE или FALSE тогда?

2. Эй, @Martin Gal, в идеале я бы хотел, чтобы это было просто ПРАВДОЙ, так как ей не с чем сравнивать. Спасибо!

Ответ №1:

После группировки по "ПортфолиоИД" разделите Enterprise Customer Party ID столбец, получите intersect list элементы с reduce , проверьте его length и преобразуйте в логический с is_greater_than

 library(dplyr)
library(purrr)
library(magrittr)
df1 %>% 
    group_by(PortfolioID) %>% 
    mutate(new = reduce(strsplit(`Enterprise Customer Party ID`, 
           ",\s "), intersect) %>%
        length %>%
        is_greater_than(0)) %>%
    ungroup
 

-выход

 # A tibble: 100 x 3
   PortfolioID `Enterprise Customer Party ID`                                              new  
   <chr>       <chr>                                                                       <lgl>
 1 z036527321  100600263, 100782628, 100753805, 100770731, 101360754, 103126734            TRUE 
 2 z036527321  100600263, 100782628, 100753805, 100770731, 101360754, 103126734            TRUE 
 3 z036527321  100600263, 100782628, 100753805, 100770731, 101360754, 103126734            TRUE 
 4 z036526431  100175650, 100434367, 100600263, 103507556, 101519578, 103134259, 103134510 TRUE 
 5 z036526421  100022778, 100570834, 100600263, 103514678, 101514778                       TRUE 
 6 z036526421  100022778, 100570834, 100600263, 103514678, 101514778                       TRUE 
 7 z036526301  100189878, 100600263, 101199515, 100746736                                  TRUE 
 8 z036525571  101065177, 103502728, 101392726, 101404531                                  TRUE 
 9 z036525571  101065177, 103502728, 101392726, 101404531                                  TRUE 
10 z036525571  101491312, 101404531, 103493687                                             TRUE 
# … with 90 more rows
 

Комментарии:

1. Это было здорово @akrun, большое вам спасибо за всю вашу помощь. Я действительно ценю это

Ответ №2:

Вы могли бы использовать

 library(stringr)
library(dplyr)
library(tidyr)

data %>% 
  add_count(PortfolioID) %>%
  mutate(`Enterprise Customer Party ID` = str_split(`Enterprise Customer Party ID`, ", ")) %>% 
  unnest(`Enterprise Customer Party ID`) %>% 
  group_by(PortfolioID) %>%
  add_count(`Enterprise Customer Party ID`) %>% 
  summarise(match = any(n == nn)) %>% 
  right_join(data, by = "PortfolioID")
 

который возвращает

 # A tibble: 100 x 3
   PortfolioID match `Enterprise Customer Party ID`            
   <chr>       <lgl> <chr>                                     
 1 z036515301  TRUE  100386081, 100600263, 100746736, 103145053
 2 z036515301  TRUE  100386081, 100600263, 101050657, 100746736
 3 z036515301  TRUE  100386081, 100600263, 101050657, 100746736
 4 z036515301  TRUE  100386081, 100600263, 100746736, 101050657
 5 z036515301  TRUE  100386081, 100600263, 100746736, 103145053
 6 z036515301  TRUE  100386081, 100600263, 100746736, 101381649
 7 z036515301  TRUE  100386081, 100600263, 101050657, 100746736
 8 z036515301  TRUE  100386081, 100600263, 100746736, 103145053
 9 z036515301  TRUE  100386081, 100600263, 101050657, 100746736
10 z036515301  TRUE  100386081, 100600263, 100746736, 103145053
# ... with 90 more rows
 

Комментарии:

1. Это сработало идеально и быстро, большое спасибо @Martin Gal

Ответ №3:

Я скопировал предоставленные вами данные в фрейм данных под названием foo .

В этом решении создается новый столбец (называемый "any_match"), который показывает TRUE , есть ли повторяющиеся идентификаторы корпоративных клиентов для одного и того же портфолио. Он возвращает a FALSE , если дубликатов нет.

Единственные случаи FALSE , которые появляются в этом решении, - это когда для портфолиоида есть только 1 строка. Таким образом, очевидно, что дубликатов не будет, потому что существует только 1 экземпляр портфолиоида.

 library(tidyverse)

foo %>%
  split(foo$PortfolioID) %>%
  map_dfr(function(pID) {
    
    pID_ecpid <- str_split(pID
 #r



Вопрос:

Вот данные, с которыми я сейчас работаю:
     structure(list(PortfolioID = c("z036527321", "z036527321", "z036527321", 
"z036526431", "z036526421", "z036526421", "z036526301", "z036525571", 
"z036525571", "z036525571", "z036525391", "z036525391", "z036525391", 
"z036525391", "z036525391", "z036525391", "z036525391", "z036525341", 
"z036525341", "z036524141", "z036524061", "z036523701", "z036523701", 
"z036523701", "z036523701", "z036523701", "z036523701", "z036523701", 
"z036523701", "z036523701", "z036522711", "z036521591", "z036521591", 
"z036521541", "z036521541", "z036521431", "z036521431", "z036521431", 
"z036521431", "z036521431", "z036521431", "z036521431", "z036521431", 
"z036521431", "z036521431", "z036520791", "z036520791", "z036520791", 
"z036520791", "z036520671", "z036520671", "z036520671", "z036520671", 
"z036520671", "z036520051", "z036520041", "z036519831", "z036519831", 
"z036519831", "z036519831", "z036519221", "z036519191", "z036518281", 
"z036518281", "z036517381", "z036516621", "z036516571", "z036516571", 
"z036516571", "z036516571", "z036516571", "z036516571", "z036516571", 
"z036516571", "z036516541", "z036516541", "z036516541", "z036515311", 
"z036515311", "z036515311", "z036515311", "z036515301", "z036515301", 
"z036515301", "z036515301", "z036515301", "z036515301", "z036515301", 
"z036515301", "z036515301", "z036515301", "z036515301", "z036515301", 
"z036515301", "z036515301", "z036515301", "z036515301", "z036515301", 
"z036515301", "z036515301"), `Enterprise Customer Party ID` = c("100600263, 100782628, 100753805, 100770731, 101360754, 103126734", 
"100600263, 100782628, 100753805, 100770731, 101360754, 103126734", 
"100600263, 100782628, 100753805, 100770731, 101360754, 103126734", 
"100175650, 100434367, 100600263, 103507556, 101519578, 103134259, 103134510", 
"100022778, 100570834, 100600263, 103514678, 101514778", "100022778, 100570834, 100600263, 103514678, 101514778", 
"100189878, 100600263, 101199515, 100746736", "101065177, 103502728, 101392726, 101404531", 
"101065177, 103502728, 101392726, 101404531", "101491312, 101404531, 103493687", 
"100363017, 100379794, 100600263, 100616003, 101296443, 103133788", 
"100363017, 100379794, 100600263, 100616003, 101296443", "100363017, 100379794, 100600263, 100616003, 101296443, 103130494", 
"100363017, 100379794, 100600263, 100616003, 101296443, 103130494", 
"100363017, 100379794, 100600263, 100616003, 101296443, 103130494", 
"100379794, 100363017, 100600263, 100616003, 101296443", "100379794, 100363017, 100600263, 100616003, 101296443, 103130494", 
"100175650, 100219612, 100434367, 100600263, 103510210, 103124599", 
"100175650, 100219612, 100600263, 103510210, 103124599, 103124680", 
"100189878, 100386081, 100556993, 100951842, 103521916", "100255427, 100599889, 100600263, 100787593, 101318358, 101466804", 
"100541378, 100600263, 100917340, 100991230", "100600263, 100640734, 100917340, 100991230, 103135413, 103489659", 
"100600263, 100640734, 100917340, 100991230, 103489659", "100600263, 100640734, 100917340, 100991230, 103489659", 
"100541378, 100600263, 100917340, 100991230", "100600263, 100640734, 100917340, 100991230, 103135413, 103489659", 
"100541378, 100600263, 100917340, 100991230", "100600263, 100640734, 100917340, 100991230, 103489659", 
"100600263, 100640734, 100917340, 100991230, 103489659", "100600263, 100987563, 101475026, 101513471, 101558213", 
"100180069, 100600263, 100714430, 101380893", "100180069, 100600263, 100693475, 100714430, 101380893", 
"100600263, 100647941, 100714430, 101497006, 101380893, 103663428", 
"100600263, 100693475, 100714430, 101497006, 101380893", "100513394, 100600263, 101250322, 100888261, 101484512", 
"100513394, 100600263, 101250322, 101488513", "100513394, 100600263, 100680615, 101250322", 
"100513394, 100600263, 100748241, 101250322", "100259186, 100513394, 100600263, 100647941, 101250322", 
"100325289, 100513394, 100600263, 101250322", "100513394, 100600263, 101250322, 101270920", 
"100358051, 100513394, 100600263, 101250322", "100513394, 100600263, 100845917, 101250322", 
"100513394, 100566608, 100600263, 101250322", "100154267, 100219612, 100600263, 101213228, 103498394, 103147666", 
"100154267, 100219612, 100600263, 101213228, 103498394, 103147666", 
"100154267, 100219612, 100600263, 101213228, 103498394, 103147666", 
"100154267, 100219612, 100600263, 101213228, 103498394, 103147666", 
"100386081, 100600263, 100746736, 100856914", "100386081, 100600263, 100746736, 100856914", 
"100386081, 100600263, 100746736, 100856914", "100386081, 100600263, 100746736, 100856914", 
"100386081, 100600263, 100746736, 100856914", "100482176, 100600263, 100615160, 100784263, 101374469", 
"100600263, 101360754, 103124701, 101436015", "100600263, 100655349, 100684621, 100823164, 101254987, 100770731, 100896421", 
"100600263, 100655349, 100684621, 100823164, 101254987, 100896421", 
"100600263, 100655349, 100684621, 100823164, 101254987, 100770731, 100896421", 
"100600263, 100684621, 100655349, 100823164, 101254987, 100770731, 100896421", 
"100513394, 100569469, 100600263, 100693475, 101344508", "100513394, 100600263, 101250322, 103124606, 103143455", 
"100178006, 103513498, 101404531", "100178006, 103513498, 101404531", 
"100532433, 100600263, 100685774, 100787593, 101344508, 103524479", 
"100110952, 100600263, 100879526, 103147348, 103147682, 103147890", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100086400, 100600263, 100991230, 103524505, 103125230, 103135888", 
"100566667, 100600263, 100603186, 103130050", "100566667, 100600263, 100603186, 103531703, 103128007", 
"100566667, 100600263, 100603186, 103531703, 103128007", "100505868, 100600263, 100879526, 101436015, 103139491, 103482495", 
"100505868, 100600263, 100879526, 103139491, 101436015, 103482495", 
"100505868, 100600263, 100879526, 101436015, 103139491, 103482495", 
"100505868, 100600263, 100879526, 101436015, 103139491, 103482495", 
"100386081, 100600263, 100746736, 103145053", "100386081, 100600263, 101050657, 100746736", 
"100386081, 100600263, 101050657, 100746736", "100386081, 100600263, 100746736, 101050657", 
"100386081, 100600263, 100746736, 103145053", "100386081, 100600263, 100746736, 101381649", 
"100386081, 100600263, 101050657, 100746736", "100386081, 100600263, 100746736, 103145053", 
"100386081, 100600263, 101050657, 100746736", "100386081, 100600263, 100746736, 103145053", 
"100019889, 100386081, 100587086, 100600263, 100746736, 103516226, 103629951, 101540702, 103143165", 
"100386081, 100600263, 100746736, 101381649", "100386081, 100600263, 100746736, 101381649", 
"100386081, 100587086, 100600263, 100746736, 101540702, 103147108", 
"100386081, 100600263, 100746736, 101381649", "100019889, 100386081, 100587086, 100600263, 100746736, 103516226, 103629951, 101540702, 103143165", 
"100386081, 100600263, 100746736, 101381649", "100019889, 100386081, 100587086, 100600263, 100746736, 103516226, 101540702, 103629951, 103143165", 
"100189878, 100386081, 100951842, 101381649")), row.names = c(NA, 
-100L), class = c("tbl_df", "tbl", "data.frame"))
 

Мне нужно знать, есть ли способ узнать, есть ли по крайней мере одно совпадающее значение в столбце B среди всех одинаковых портфолиоидов. Например, для портфолиоида z036527321 мы видим, что среди списков определенно есть одно совпадение (100600263 и множество других). Там будет несколько портфолиоидов, где между ними всеми не будет ни одного совпадения. Все, что мне нужно, - это какой-то индикатор. Поставьте 1, если все портфели имеют одно одинаковое значение, и 0, если нет. Я действительно ценю вашу помощь заранее. Спасибо!

Комментарии:

1. Если есть только один портфель, должен ли он быть TRUE или FALSE тогда?

2. Эй, @Martin Gal, в идеале я бы хотел, чтобы это было просто ПРАВДОЙ, так как ей не с чем сравнивать. Спасибо!

Ответ №1:

После группировки по "ПортфолиоИД" разделите Enterprise Customer Party ID столбец, получите intersect list элементы с reduce , проверьте его length и преобразуйте в логический с is_greater_than

 library(dplyr)
library(purrr)
library(magrittr)
df1 %>% 
    group_by(PortfolioID) %>% 
    mutate(new = reduce(strsplit(`Enterprise Customer Party ID`, 
           ",\s "), intersect) %>%
        length %>%
        is_greater_than(0)) %>%
    ungroup
 

-выход

 # A tibble: 100 x 3
   PortfolioID `Enterprise Customer Party ID`                                              new  
   <chr>       <chr>                                                                       <lgl>
 1 z036527321  100600263, 100782628, 100753805, 100770731, 101360754, 103126734            TRUE 
 2 z036527321  100600263, 100782628, 100753805, 100770731, 101360754, 103126734            TRUE 
 3 z036527321  100600263, 100782628, 100753805, 100770731, 101360754, 103126734            TRUE 
 4 z036526431  100175650, 100434367, 100600263, 103507556, 101519578, 103134259, 103134510 TRUE 
 5 z036526421  100022778, 100570834, 100600263, 103514678, 101514778                       TRUE 
 6 z036526421  100022778, 100570834, 100600263, 103514678, 101514778                       TRUE 
 7 z036526301  100189878, 100600263, 101199515, 100746736                                  TRUE 
 8 z036525571  101065177, 103502728, 101392726, 101404531                                  TRUE 
 9 z036525571  101065177, 103502728, 101392726, 101404531                                  TRUE 
10 z036525571  101491312, 101404531, 103493687                                             TRUE 
# … with 90 more rows
 

Комментарии:

1. Это было здорово @akrun, большое вам спасибо за всю вашу помощь. Я действительно ценю это

Ответ №2:

Вы могли бы использовать

 library(stringr)
library(dplyr)
library(tidyr)

data %>% 
  add_count(PortfolioID) %>%
  mutate(`Enterprise Customer Party ID` = str_split(`Enterprise Customer Party ID`, ", ")) %>% 
  unnest(`Enterprise Customer Party ID`) %>% 
  group_by(PortfolioID) %>%
  add_count(`Enterprise Customer Party ID`) %>% 
  summarise(match = any(n == nn)) %>% 
  right_join(data, by = "PortfolioID")
 

который возвращает

 # A tibble: 100 x 3
   PortfolioID match `Enterprise Customer Party ID`            
   <chr>       <lgl> <chr>                                     
 1 z036515301  TRUE  100386081, 100600263, 100746736, 103145053
 2 z036515301  TRUE  100386081, 100600263, 101050657, 100746736
 3 z036515301  TRUE  100386081, 100600263, 101050657, 100746736
 4 z036515301  TRUE  100386081, 100600263, 100746736, 101050657
 5 z036515301  TRUE  100386081, 100600263, 100746736, 103145053
 6 z036515301  TRUE  100386081, 100600263, 100746736, 101381649
 7 z036515301  TRUE  100386081, 100600263, 101050657, 100746736
 8 z036515301  TRUE  100386081, 100600263, 100746736, 103145053
 9 z036515301  TRUE  100386081, 100600263, 101050657, 100746736
10 z036515301  TRUE  100386081, 100600263, 100746736, 103145053
# ... with 90 more rows
 

Комментарии:

1. Это сработало идеально и быстро, большое спасибо @Martin Gal

Ответ №3:

Я скопировал предоставленные вами данные в фрейм данных под названием foo .

В этом решении создается новый столбец (называемый "any_match"), который показывает TRUE , есть ли повторяющиеся идентификаторы корпоративных клиентов для одного и того же портфолио. Он возвращает a FALSE , если дубликатов нет.

Единственные случаи FALSE , которые появляются в этом решении, - это когда для портфолиоида есть только 1 строка. Таким образом, очевидно, что дубликатов не будет, потому что существует только 1 экземпляр портфолиоида.

Enterprise Customer Party ID`, ', ')

match_check <- rep(NA, length(pID_ecpid))

for (i in 1:length(pID_ecpid)) {
check_with <- pID_ecpid[[i]]
check_against <- unlist(pID_ecpid[-i])
match_check[i] <- any(check_with %in% check_against)
}

pID <- pID %>%
mutate(any_match = all(match_check))

return(pID)

})

Комментарии:

1. Это действительно близко к тому, что мне нужно, большое вам спасибо за вашу помощь. Мне действительно нужно это, чтобы проверить и убедиться, что в каждом экземпляре портфолиоида есть тот, который соответствует. Я думаю, что ваш код ищет, есть ли хотя бы 1 дубликат для данного портфолиоида. Например, если в портфолио 5 строк, мне нужно знать, есть ли во всех 5 строках хотя бы одна совпадающая. Если не у всех 5 есть один, который совпадает, то FALSE, а если все они совпадают, то TRUE. @Харрисон Джонс

2. Внес некоторые правки. Попробуйте эту версию и посмотрите, исправит ли она проблему. У вас есть пример портфолиоида, где это происходит? Я не могу найти ни одного.

3. В итоге все получилось отлично, просто потребовалось много времени, чтобы закончить. @Харрисон Джонс, большое вам спасибо за вашу помощь!

Ответ №4:

Основание R

Enterprise Customer Party ID`,
df$PortfolioID
),
strsplit_to_vec,
",\s "
)

# Determine if any other portfolio contains thos ecpids:
# matching_ecpid => numeric vector
matching_ecpid <- setNames(
vapply(
seq_along(split_str_list),
function(i){
tmp_vec <- do.call(c, split_str_list[-i])
if(length(intersect(split_str_list[[i]], tmp_vec)) > 0){
1
}else{
0
}
},
numeric(1)
),
names(split_str_list)
)

# Assign the result back to the data.frame:
# ecpid_match => numeric vector
df$ecpid_match <- matching_ecpid[
match(
df$PortfolioID,
names(matching_ecpid)
)
]