Удаление компонентов на основе разных имен между двумя списками

#r #dplyr #tidyverse

Вопрос:

У меня есть два списка фреймов данных, но в одном есть дополнительный ID . Я хотел бы удалить лишнее ID , используя имена, присвоенные каждому компоненту списка. Мой фактический набор данных содержит множество ID s, поэтому я хотел бы, по сути, создать функцию, которая позволит мне удалить все ID с другим именем, используя имена в другом списке в качестве индекса.

Как я мог пойти на это? В этом случае я бы удалил ID D их из списка и не из-за фреймов данных D , а потому , что имена в july2 них отличаются от имен внутри july .

Я пробовал использовать setdiff , но в итоге он просто возвращает список, который я помещаю в первый аргумент.

 gt; setdiff(july, july2) lt;list_oflt;  tbl_dflt;  date : date  x : double  y : double  ID : character  jDate: double  Month: double  new : date  gt; gt;[12]gt; $A # A tibble: 16 x 7  date x y ID jDate Month new   lt;dategt; lt;dblgt; lt;dblgt; lt;chrgt; lt;dblgt; lt;dblgt; lt;dategt;   1 2010-07-04 60161. 800440. A 14794 7 2010-07-01  2 2010-07-08 61139. 825947. A 14798 7 2010-07-01  3 2010-07-04 60161. 800440. A 14794 7 2010-07-01  4 2010-07-08 61139. 825947. A 14798 7 2010-07-01  5 2010-07-04 60161. 800440. A 14794 7 2010-07-01  6 2010-07-08 61139. 825947. A 14798 7 2010-07-01  7 2010-07-04 60161. 800440. A 14794 7 2010-07-01  8 2010-07-08 61139. 825947. A 14798 7 2010-07-01  9 2010-07-04 60161. 800440. A 14794 7 2010-07-01 10 2010-07-08 61139. 825947. A 14798 7 2010-07-01 11 2010-07-04 60161. 800440. A 14794 7 2010-07-01 12 2010-07-08 61139. 825947. A 14798 7 2010-07-01 13 2010-07-04 60161. 800440. A 14794 7 2010-07-01 14 2010-07-08 61139. 825947. A 14798 7 2010-07-01 15 2010-07-04 60161. 800440. A 14794 7 2010-07-01 16 2010-07-08 61139. 825947. A 14798 7 2010-07-01  $A # A tibble: 24 x 7  date x y ID jDate Month new   lt;dategt; lt;dblgt; lt;dblgt; lt;chrgt; lt;dblgt; lt;dblgt; lt;dategt;   1 2010-07-12 66502. 804956. A 14802 7 2010-07-11  2 2010-07-16 79728. 858097. A 14806 7 2010-07-11  3 2010-07-20 77342. 830852. A 14810 7 2010-07-11  4 2010-07-12 66502. 804956. A 14802 7 2010-07-11  5 2010-07-16 79728. 858097. A 14806 7 2010-07-11  6 2010-07-20 77342. 830852. A 14810 7 2010-07-11  7 2010-07-12 66502. 804956. A 14802 7 2010-07-11  8 2010-07-16 79728. 858097. A 14806 7 2010-07-11  9 2010-07-20 77342. 830852. A 14810 7 2010-07-11 10 2010-07-12 66502. 804956. A 14802 7 2010-07-11 # ... with 14 more rows  $A # A tibble: 16 x 7  date x y ID jDate Month new   lt;dategt; lt;dblgt; lt;dblgt; lt;chrgt; lt;dblgt; lt;dblgt; lt;dategt;   1 2010-07-24 75483. 828763. A 14814 7 2010-07-21  2 2010-07-28 69508. 806470. A 14818 7 2010-07-21  3 2010-07-24 75483. 828763. A 14814 7 2010-07-21  4 2010-07-28 69508. 806470. A 14818 7 2010-07-21  5 2010-07-24 75483. 828763. A 14814 7 2010-07-21  6 2010-07-28 69508. 806470. A 14818 7 2010-07-21  7 2010-07-24 75483. 828763. A 14814 7 2010-07-21  8 2010-07-28 69508. 806470. A 14818 7 2010-07-21  9 2010-07-24 75483. 828763. A 14814 7 2010-07-21 10 2010-07-28 69508. 806470. A 14818 7 2010-07-21 11 2010-07-24 75483. 828763. A 14814 7 2010-07-21 12 2010-07-28 69508. 806470. A 14818 7 2010-07-21 13 2010-07-24 75483. 828763. A 14814 7 2010-07-21 14 2010-07-28 69508. 806470. A 14818 7 2010-07-21 15 2010-07-24 75483. 828763. A 14814 7 2010-07-21 16 2010-07-28 69508. 806470. A 14818 7 2010-07-21  $B # A tibble: 24 x 7  date x y ID jDate Month new   lt;dategt; lt;dblgt; lt;dblgt; lt;chrgt; lt;dblgt; lt;dblgt; lt;dategt;   1 2010-07-01 72826. 888060. B 14791 7 2010-07-01  2 2010-07-05 67469. 807307. B 14795 7 2010-07-01  3 2010-07-09 77834. 868002. B 14799 7 2010-07-01  4 2010-07-01 72826. 888060. B 14791 7 2010-07-01  5 2010-07-05 67469. 807307. B 14795 7 2010-07-01  6 2010-07-09 77834. 868002. B 14799 7 2010-07-01  7 2010-07-01 72826. 888060. B 14791 7 2010-07-01  8 2010-07-05 67469. 807307. B 14795 7 2010-07-01  9 2010-07-09 77834. 868002. B 14799 7 2010-07-01 10 2010-07-01 72826. 888060. B 14791 7 2010-07-01 # ... with 14 more rows  $B # A tibble: 16 x 7  date x y ID jDate Month new   lt;dategt; lt;dblgt; lt;dblgt; lt;chrgt; lt;dblgt; lt;dblgt; lt;dategt;   1 2010-07-13 74643. 845222. B 14803 7 2010-07-11  2 2010-07-17 78530. 807316. B 14807 7 2010-07-11  3 2010-07-13 74643. 845222. B 14803 7 2010-07-11  4 2010-07-17 78530. 807316. B 14807 7 2010-07-11  5 2010-07-13 74643. 845222. B 14803 7 2010-07-11  6 2010-07-17 78530. 807316. B 14807 7 2010-07-11  7 2010-07-13 74643. 845222. B 14803 7 2010-07-11  8 2010-07-17 78530. 807316. B 14807 7 2010-07-11  9 2010-07-13 74643. 845222. B 14803 7 2010-07-11 10 2010-07-17 78530. 807316. B 14807 7 2010-07-11 11 2010-07-13 74643. 845222. B 14803 7 2010-07-11 12 2010-07-17 78530. 807316. B 14807 7 2010-07-11 13 2010-07-13 74643. 845222. B 14803 7 2010-07-11 14 2010-07-17 78530. 807316. B 14807 7 2010-07-11 15 2010-07-13 74643. 845222. B 14803 7 2010-07-11 16 2010-07-17 78530. 807316. B 14807 7 2010-07-11  $B # A tibble: 24 x 7  date x y ID jDate Month new   lt;dategt; lt;dblgt; lt;dblgt; lt;chrgt; lt;dblgt; lt;dblgt; lt;dategt;   1 2010-07-21 61332. 840310. B 14811 7 2010-07-21  2 2010-07-25 69102. 809024. B 14815 7 2010-07-21  3 2010-07-29 66088. 817887. B 14819 7 2010-07-21  4 2010-07-21 61332. 840310. B 14811 7 2010-07-21  5 2010-07-25 69102. 809024. B 14815 7 2010-07-21  6 2010-07-29 66088. 817887. B 14819 7 2010-07-21  7 2010-07-21 61332. 840310. B 14811 7 2010-07-21  8 2010-07-25 69102. 809024. B 14815 7 2010-07-21  9 2010-07-29 66088. 817887. B 14819 7 2010-07-21 10 2010-07-21 61332. 840310. B 14811 7 2010-07-21 # ... with 14 more rows  $C # A tibble: 24 x 7  date x y ID jDate Month new   lt;dategt; lt;dblgt; lt;dblgt; lt;chrgt; lt;dblgt; lt;dblgt; lt;dategt;   1 2010-07-02 71110. 898586. C 14792 7 2010-07-01  2 2010-07-06 78769. 821287. C 14796 7 2010-07-01  3 2010-07-10 62446. 874366. C 14800 7 2010-07-01  4 2010-07-02 71110. 898586. C 14792 7 2010-07-01  5 2010-07-06 78769. 821287. C 14796 7 2010-07-01  6 2010-07-10 62446. 874366. C 14800 7 2010-07-01  7 2010-07-02 71110. 898586. C 14792 7 2010-07-01  8 2010-07-06 78769. 821287. C 14796 7 2010-07-01  9 2010-07-10 62446. 874366. C 14800 7 2010-07-01 10 2010-07-02 71110. 898586. C 14792 7 2010-07-01 # ... with 14 more rows  $C # A tibble: 16 x 7  date x y ID jDate Month new   lt;dategt; lt;dblgt; lt;dblgt; lt;chrgt; lt;dblgt; lt;dblgt; lt;dategt;   1 2010-07-14 77316. 882468. C 14804 7 2010-07-11  2 2010-07-18 65028. 815016. C 14808 7 2010-07-11  3 2010-07-14 77316. 882468. C 14804 7 2010-07-11  4 2010-07-18 65028. 815016. C 14808 7 2010-07-11  5 2010-07-14 77316. 882468. C 14804 7 2010-07-11  6 2010-07-18 65028. 815016. C 14808 7 2010-07-11  7 2010-07-14 77316. 882468. C 14804 7 2010-07-11  8 2010-07-18 65028. 815016. C 14808 7 2010-07-11  9 2010-07-14 77316. 882468. C 14804 7 2010-07-11 10 2010-07-18 65028. 815016. C 14808 7 2010-07-11 11 2010-07-14 77316. 882468. C 14804 7 2010-07-11 12 2010-07-18 65028. 815016. C 14808 7 2010-07-11 13 2010-07-14 77316. 882468. C 14804 7 2010-07-11 14 2010-07-18 65028. 815016. C 14808 7 2010-07-11 15 2010-07-14 77316. 882468. C 14804 7 2010-07-11 16 2010-07-18 65028. 815016. C 14808 7 2010-07-11  $C # A tibble: 24 x 7  date x y ID jDate Month new   lt;dategt; lt;dblgt; lt;dblgt; lt;chrgt; lt;dblgt; lt;dblgt; lt;dategt;   1 2010-07-22 65117. 866750. C 14812 7 2010-07-21  2 2010-07-26 78462. 823259. C 14816 7 2010-07-21  3 2010-07-30 69577. 848118. C 14820 7 2010-07-21  4 2010-07-22 65117. 866750. C 14812 7 2010-07-21  5 2010-07-26 78462. 823259. C 14816 7 2010-07-21  6 2010-07-30 69577. 848118. C 14820 7 2010-07-21  7 2010-07-22 65117. 866750. C 14812 7 2010-07-21  8 2010-07-26 78462. 823259. C 14816 7 2010-07-21  9 2010-07-30 69577. 848118. C 14820 7 2010-07-21 10 2010-07-22 65117. 866750. C 14812 7 2010-07-21 # ... with 14 more rows  $D # A tibble: 16 x 7  date x y ID jDate Month new   lt;dategt; lt;dblgt; lt;dblgt; lt;chrgt; lt;dblgt; lt;dblgt; lt;dategt;   1 2010-07-03 77586. 819905. D 14793 7 2010-07-01  2 2010-07-07 76249. 848582. D 14797 7 2010-07-01  3 2010-07-03 77586. 819905. D 14793 7 2010-07-01  4 2010-07-07 76249. 848582. D 14797 7 2010-07-01  5 2010-07-03 77586. 819905. D 14793 7 2010-07-01  6 2010-07-07 76249. 848582. D 14797 7 2010-07-01  7 2010-07-03 77586. 819905. D 14793 7 2010-07-01  8 2010-07-07 76249. 848582. D 14797 7 2010-07-01  9 2010-07-03 77586. 819905. D 14793 7 2010-07-01 10 2010-07-07 76249. 848582. D 14797 7 2010-07-01 11 2010-07-03 77586. 819905. D 14793 7 2010-07-01 12 2010-07-07 76249. 848582. D 14797 7 2010-07-01 13 2010-07-03 77586. 819905. D 14793 7 2010-07-01 14 2010-07-07 76249. 848582. D 14797 7 2010-07-01 15 2010-07-03 77586. 819905. D 14793 7 2010-07-01 16 2010-07-07 76249. 848582. D 14797 7 2010-07-01  $D # A tibble: 24 x 7  date x y ID jDate Month new   lt;dategt; lt;dblgt; lt;dblgt; lt;chrgt; lt;dblgt; lt;dblgt; lt;dategt;   1 2010-07-11 61531. 883305. D 14801 7 2010-07-11  2 2010-07-15 69514. 867063. D 14805 7 2010-07-11  3 2010-07-19 69178. 890183. D 14809 7 2010-07-11  4 2010-07-11 61531. 883305. D 14801 7 2010-07-11  5 2010-07-15 69514. 867063. D 14805 7 2010-07-11  6 2010-07-19 69178. 890183. D 14809 7 2010-07-11  7 2010-07-11 61531. 883305. D 14801 7 2010-07-11  8 2010-07-15 69514. 867063. D 14805 7 2010-07-11  9 2010-07-19 69178. 890183. D 14809 7 2010-07-11 10 2010-07-11 61531. 883305. D 14801 7 2010-07-11 # ... with 14 more rows  $D # A tibble: 24 x 7  date x y ID jDate Month new   lt;dategt; lt;dblgt; lt;dblgt; lt;chrgt; lt;dblgt; lt;dblgt; lt;dategt;   1 2010-07-23 74554. 898077. D 14813 7 2010-07-21  2 2010-07-27 77455. 834715. D 14817 7 2010-07-21  3 2010-07-31 77461. 873993. D 14821 7 2010-07-21  4 2010-07-23 74554. 898077. D 14813 7 2010-07-21  5 2010-07-27 77455. 834715. D 14817 7 2010-07-21  6 2010-07-31 77461. 873993. D 14821 7 2010-07-21  7 2010-07-23 74554. 898077. D 14813 7 2010-07-21  8 2010-07-27 77455. 834715. D 14817 7 2010-07-21  9 2010-07-31 77461. 873993. D 14821 7 2010-07-21 10 2010-07-23 74554. 898077. D 14813 7 2010-07-21 # ... with 14 more rows   
 ID lt;- rep(c("A","B","C", "D"), 1000) ID2 lt;- rep(c("A", "B", "C"), 1000) date lt;- rep_len(seq(dmy("01-01-2010"), dmy("31-12-2013"), by = "days"), 500) x lt;- runif(length(date), min = 60000, max = 80000) y lt;- runif(length(date), min = 800000, max = 900000)  df lt;- data.frame(date = date,   x = x,  y =y,  ID)  df2 lt;- data.frame(date = date,   x = x,  y =y,  ID2)  df2$jDate lt;- julian(as.Date(df2$date), origin = as.Date("1970-01-01")) df2$Month lt;- month(df2$date)  july lt;- df %gt;%  # Creates a new column assigning the first day in the 10-day interval in which  # the date falls under (e.g., 01-03-2021 would be in the first 10-day interval  # so the `floor_date` assigned to it would be 01-01-2021)  mutate(new = floor_date(date, "10 days")) %gt;%  # For any months that has 31 days, the 31st day would normally be assigned its   # own interval. The code below takes the 31st day and joins it with the   # previous interval.   group_by(ID) %gt;%   mutate(new = if_else(day(new) == 31, new - days(10), new)) %gt;%   group_by(new, .add = TRUE) %gt;%  # Filter the data by the season based on the `season_categ` column  filter(Month == "7") %gt;%   group_split()  july2 lt;- df2 %gt;%  # Creates a new column assigning the first day in the 10-day interval in which  # the date falls under (e.g., 01-03-2021 would be in the first 10-day interval  # so the `floor_date` assigned to it would be 01-01-2021)  mutate(new = floor_date(date, "10 days")) %gt;%  # For any months that has 31 days, the 31st day would normally be assigned its   # own interval. The code below takes the 31st day and joins it with the   # previous interval.   group_by(ID2) %gt;%   mutate(new = if_else(day(new) == 31, new - days(10), new)) %gt;%   group_by(new, .add = TRUE) %gt;%  # Filter the data by the season based on the `season_categ` column  filter(Month == "7") %gt;%   group_split()  names(july) lt;- sapply(july, function(x) paste(x$ID[1])) names(july2) lt;- sapply(july2, function(x) paste(x$ID2[1]))  

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

1. Я думаю, вам нужно добавить выписку за месяц df$для июльского задания.

Ответ №1:

Похоже, вы пытаетесь удалить записи в списке за июль, у которых нет имен в списке за июль 2. Если это так, добавление приведенного ниже кода в ваш стек сделает свое дело:

 # Get the unique names of the `july` list jul_names lt;- unique(names(july)) # Find out which names are shared between the two lists same_names lt;- jul_names[jul_names%in%unique(names(july2))] # Subset the july list to only keep those entries with specific names july lt;- july[names(july)%in%same_names]  

Если это не то, на что вы надеетесь, то нам понадобится еще несколько подробностей об этой проблеме. Как отметил комментатор, в вашем репрексе есть пара ошибок, поэтому я сделал свое лучшее предположение о том, что вы пытались сделать:

 july lt;- df %gt;%  mutate(new = floor_date(date, "10 days")) %gt;%  mutate(new = if_else(day(new) == 31, new - days(10), new)) %gt;%   group_by(ID, new) %gt;%  filter(month(date) == 7) %gt;%   group_split()