Запрос Flattening Linq Group

Чтобы удалить строки, где value равно NA, используйте filter:

test.df %>% group_by(origin,year) %>% 
  filter(!is.na(value)) %>% count()

# A tibble: 20 x 3
# Groups:   origin, year [20]
   origin year      n
   <fct>  <fct> <int>
 1 CAN    1998      4
 2 CAN    2000      3
 3 CHN    1998      3
 4 CHN    2000      4
 5 DEU    1998      4
 6 DEU    2000      4
 7 GBR    1998      4
 8 GBR    2000      4
 9 ITA    1998      3
10 ITA    2000      4
11 JPN    1998      3
12 JPN    2000      3
13 KOR    1998      4
14 KOR    2000      4
15 MEX    1998      4
16 MEX    2000      4
17 NLD    1998      3
18 NLD    2000      4
19 USA    1998      4
20 USA    2000      4

Обратите внимание, однако, что это не подсчитывает, сколько type есть в каждом группа, но сколько строк. Если вы хотите посчитать количество уникальных type с, вы можете сделать это:

test.df %>% group_by(origin,year) %>% 
  filter(!is.na(value)) %>% 
  summarize(n_distinct(type)) #Merci, @Frank!

# A tibble: 20 x 3
# Groups:   origin [?]
   origin year  `length(unique(type))`
   <fct>  <fct>                  <int>
 1 CAN    1998                       3
 2 CAN    2000                       3
 3 CHN    1998                       2
 4 CHN    2000                       3
 5 DEU    1998                       4
 6 DEU    2000                       3
 7 GBR    1998                       4
 8 GBR    2000                       4
 9 ITA    1998                       3
10 ITA    2000                       4
11 JPN    1998                       3
12 JPN    2000                       2
13 KOR    1998                       4
14 KOR    2000                       4
15 MEX    1998                       3
16 MEX    2000                       3
17 NLD    1998                       2
18 NLD    2000                       3
19 USA    1998                       3
20 USA    2000                       4
8
задан Jonathan Parker 6 April 2009 в 02:16
поделиться

3 ответа

Почему не делают Вас select g.First() вместо этого?

3
ответ дан 5 December 2019 в 11:27
поделиться

Вы могли всегда вкладывать свои запросы:

var query =
    from i in (
        from c in list 
        orderby c.AddressPurpose descending 
        group c by c.ID into g 
        select g)
    select i.First();

return query;

Я уверен, что это не единственный способ сделать это (или возможно даже лучшее), но это действительно переносит Ваш "foreach" в один запрос.

Править

На самом деле можно упростить это вниз до:

var query = from c in list
            orderby c.AddressPurpose descending
            group c by c.ID into g
            select g.First();

Это, кажется, дает правильный результат.

10
ответ дан 5 December 2019 в 11:27
поделиться
var finalList = list
  .GroupBy(c => c.ID)
  .Select(g => g.OrderByDescending(c => c.AddressPurpose).First())
  .ToList();
2
ответ дан 5 December 2019 в 11:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: