Чтобы удалить строки, где 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
Вы могли всегда вкладывать свои запросы:
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();
Это, кажется, дает правильный результат.
var finalList = list
.GroupBy(c => c.ID)
.Select(g => g.OrderByDescending(c => c.AddressPurpose).First())
.ToList();