функция pmap в R

следующий код для этого примера набора данных работал до октября 2020 года. Обратите внимание, что это пример, и у меня есть обширный набор данных. Однако, когда я запускаю его сейчас, он не работает.

library(dplyr)
library(purrr)
library(readr)
library(tidyr)

"ROW,ISIN,YEAR,DIRECTOR_NAME,DIRECTOR_ID
1,US9898171015,2006,Thomas (Tom) E Davin,2247441792
2,US9898171015,2006,Matthew (Matt) L Hyde,4842568996
3,US9898171015,2007,James (Jim) M Weber,3581636766
4,US9898171015,2007,Matthew (Matt) L Hyde,4842568996
5,US9898171015,2007,David (Dave) M DeMattei,759047198
6,US9898171015,2008,James (Jim) M Weber,3581636766
7,US9898171015,2008,Matthew (Matt) L Hyde,4842568996
8,US9898171015,2008,David (Dave) M DeMattei,759047198
9,US9898171015,2009,William (Bill) Milroy Barnum Jr,20462211719
10,US9898171015,2009,James (Jim) M Weber,3581636766
11,US9898171015,2009,Matthew (Matt) L Hyde,4842568996
12,US9898171015,2009,David (Dave) M DeMattei,759047198
13,US9898171015,2010,William (Bill) Milroy Barnum Jr,20462211719
14,US9898171015,2010,James (Jim) M Weber,3581636766
15,US9898171015,2010,Matthew (Matt) L Hyde,4842568996
16,US9898171015,2011,Sarah (Sally) Gaines McCoy,11434863691
17,US9898171015,2011,William (Bill) Milroy Barnum Jr,20462211719
18,US9898171015,2011,James (Jim) M Weber,3581636766
19,US9898171015,2011,Matthew (Matt) L Hyde,4842568996
20,US9898171015,2012,Sarah (Sally) Gaines McCoy,11434863691
21,US9898171015,2012,Ernest R Johnson,40425210975
22,US9898171015,2013,Sarah (Sally) Gaines McCoy,11434863691
23,US9898171015,2013,Ernest R Johnson,40425210975
24,US9898171015,2013,Travis D Smith,53006212569
25,US9898171015,2014,Sarah (Sally) Gaines McCoy,11434863691
26,US9898171015,2014,Ernest R Johnson,40425210975
27,US9898171015,2014,Travis D Smith,53006212569
28,US9898171015,2015,Kalen F Holmes,11051172801
29,US9898171015,2015,Sarah (Sally) Gaines McCoy,11434863691
30,US9898171015,2015,Ernest R Johnson,40425210975
31,US9898171015,2015,Travis D Smith,53006212569
32,US9898171015,2016,Sarah (Sally) Gaines McCoy,11434863691
33,US9898171015,2016,Ernest R Johnson,40425210975
34,US9898171015,2016,Travis D Smith,53006212569
35,US9898171015,2017,Sarah (Sally) Gaines McCoy,11434863691
36,US9898171015,2017,Scott Andrew Bailey,174000000000
37,US9898171015,2017,Ernest R Johnson,40425210975
38,US9898171015,2017,Travis D Smith,53006212569
" %>% 
  read_csv() %>% 
  group_by(ISIN, YEAR) %>% 
  nest(.key = "OTHER_DATA") %>% 
  group_by(ISIN) %>% 
  mutate(OTHER_DATA_LAG = lag(OTHER_DATA, 1), 
         OTHER_DATA_LEAD = lead(OTHER_DATA, 1), 
         KEEP = pmap(list(OTHER_DATA_LAG, OTHER_DATA, OTHER_DATA_LEAD), function(x, y, z) {
           isTRUE(all_equal(x["DIRECTOR_ID"], y["DIRECTOR_ID"])) || 
           isTRUE(all_equal(y["DIRECTOR_ID"], z["DIRECTOR_ID"]))
         })) %>% 
  filter(unlist(KEEP)) %>% 
  select(-OTHER_DATA_LAG, -OTHER_DATA_LEAD, -KEEP) %>% 
  unnest() %>% 
  ungroup()

Затем я разместил сообщение здесь, и кто-то помог мне со следующим кодом:

library(tidyverse)

ceo1 %>% 
  group_by(ISIN, YEAR) %>% 
  nest(OTHER_DATA = c(ROW, DIRECTOR_NAME, DIRECTOR_ID)) %>% 
  group_by(ISIN) %>% 
  mutate(OTHER_DATA_LAG = lag(OTHER_DATA, 1), 
         OTHER_DATA_LEAD = lead(OTHER_DATA, 1),
         KEEP = pmap_lgl(list(OTHER_DATA_LAG, OTHER_DATA, OTHER_DATA_LEAD), function(x, y, z) {
           if(length(x) > 0 && length(y) > 0 && length(z) > 0)
                isTRUE(all_equal(x["DIRECTOR_ID"], y["DIRECTOR_ID"])) ||
                isTRUE(all_equal(y["DIRECTOR_ID"], z["DIRECTOR_ID"]))
           else FALSE
         })) %>% 
  filter(KEEP) %>% 
  select(-OTHER_DATA_LAG, -OTHER_DATA_LEAD, -KEEP) %>% 
  unnest(cols = c(OTHER_DATA)) %>% 
  ungroup()

Это сработало идеально для этого набора данных SAMPLE, но когда я применил его к своему БОЛЬШОМУ НАБОРУ ДАННЫХ, это сработало, но проблема в том, что я не получаю тех же наблюдений, что и я. когда я запустил старый код (этот первый код здесь). Кажется, проблема связана с функцией pmap, потому что она генерирует NULL и имеет проблемы. Вот ссылки двух моих предыдущих кодов -

Первый - Фильтрация данных с использованием функции dplyr в R Второй - Проблемы с tidyverse

Кто-нибудь может пролить свет, чтобы я мог запустить свой старый код (первый)?


person Sharif    schedule 06.03.2021    source источник


Ответы (1)


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

Между тем, вы можете попробовать этот код:

df %>%
  group_by(YEAR) %>%
  summarise(DIRECTOR_ID = list(DIRECTOR_ID)) %>%
  mutate(flag = map2_lgl(DIRECTOR_ID, lag(DIRECTOR_ID),
                     ~length(.x) == length(.y) && all(sort(.x) == sort(.y)))) %>%
  filter(flag | lead(flag)) %>%
  select(YEAR) %>%
  left_join(df, by = 'YEAR')

#   YEAR   ROW ISIN         DIRECTOR_NAME              DIRECTOR_ID
#   <dbl> <dbl> <chr>        <chr>                            <dbl>
# 1  2007     3 US9898171015 James (Jim) M Weber         3581636766
# 2  2007     4 US9898171015 Matthew (Matt) L Hyde       4842568996
# 3  2007     5 US9898171015 David (Dave) M DeMattei      759047198
# 4  2008     6 US9898171015 James (Jim) M Weber         3581636766
# 5  2008     7 US9898171015 Matthew (Matt) L Hyde       4842568996
# 6  2008     8 US9898171015 David (Dave) M DeMattei      759047198
# 7  2013    22 US9898171015 Sarah (Sally) Gaines McCoy 11434863691
# 8  2013    23 US9898171015 Ernest R Johnson           40425210975
# 9  2013    24 US9898171015 Travis D Smith             53006212569
#10  2014    25 US9898171015 Sarah (Sally) Gaines McCoy 11434863691
#11  2014    26 US9898171015 Ernest R Johnson           40425210975
#12  2014    27 US9898171015 Travis D Smith             53006212569
person Ronak Shah    schedule 07.03.2021
comment
Спасибо за ваш код, но мой старый код сейчас не работает, поэтому я не могу создать новый набор данных. По сути, я не сохранял вывод из своего кода. Я просто запустил их и сохранил результаты для своего исследования. Теперь, когда я пытаюсь запустить код, и он не дает старого результата, я обнаруживаю, что количество наблюдений в новом коде отличается от количества наблюдений в старом коде. Я беспокоюсь, так как не нашел способов запустить свой старый код, чтобы получить мои предыдущие результаты. - person Sharif; 07.03.2021
comment
Я думаю, что вместо того, чтобы сосредотачиваться на коде, нам следует сосредоточиться на проблеме, которую вы пытаетесь решить. Я прочитал ваш исходный пост и обновил свой ответ, чтобы получить ожидаемый результат на основе этого. Можете ли вы попробовать это @Sharif - person Ronak Shah; 08.03.2021