сохраните все отдельные столбцы вместо одного r

#r #filter #dplyr #distinct

Вопрос:

Я пытаюсь найти всех отправителей, которые отправили 4 или более отдельным получателям (по имени), где общая сумма, отправленная этим отдельным получателям, превышает 5000.00 долларов, и ищу способ сообщить r, чтобы сохранить все значения, содержащие разные имена, вместо одного.

Например, используя следующие данные.фрейм:

 sender<-c("tom","tom","kevin","frank","tom","chris","tom","tom","craig","louis",
      "john", "tom","brian","tom","George")
reciever<-c("ryan","dave","sarah","kel","eric","ben","wayne","mike","brenda","christina",
        "brianna","hal","sam","ryan","van")
amount<-as.numeric(c("200","100","300","3000","100","350","100","90","670","865","600",
      "300","1300","5200","200"))
dF<-data.frame(sender,reciever,amount)
 

Применение следующих параметров с помощью dpylr:

 dF1<-dF%>%
  distinct(reciever,.keep_all = TRUE)%>%
  group_by(sender)%>%
  summarise(
    count=n(),
    total = sum(amount)  
  )%>%
  filter(count >= 4 amp; total>5000) 
 

Вы заметите, что целью в примере вектора отправителя является том. у тома есть 2 транзакции с Райаном, однако из-за характера отдельной функции r извлекает первый столбец с Райаном, где соответствующая сумма равна 200, и исключает другой столбец с Райаном, который равен 5200. Это исключение представляет проблему, поскольку исключенная транзакция (если она включена) будет соответствовать логике порога в 5000 долларов, применяемого в фильтре.

Есть ли способ, используя функцию distinct, указать r, чтобы все события, связанные с аналогичным отдельным именем, сохранялись? Или мне следует подойти к этому с совершенно другой точки зрения?

Спасибо!

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

1. В качестве продолжения, если есть лучший способ сделать это с помощью SQL, не стесняйтесь предоставлять предлагаемый вами код SQL, так как я могу загрузить пакет sqldf в r. Спасибо, что посмотрели!

2. Было бы лучше, если бы вы также показали ожидаемый результат для перекрестной проверки

Ответ №1:

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

 library(dplyr)
dF %>%
    group_by(sender) %>% 
    filter(n_distinct(reciever) >=4, sum(amount) >=5000) %>%
    ungroup
 

-выход

 # A tibble: 7 x 3
  sender reciever amount
  <chr>  <chr>     <dbl>
1 tom    ryan        200
2 tom    dave        100
3 tom    eric        100
4 tom    wayne       100
5 tom    mike         90
6 tom    hal         300
7 tom    ryan       5200
 

Если нам нужны только те пары, которые удовлетворяют условию

 dF %>%
     group_by(sender) %>% 
     filter(n_distinct(reciever) >=4, sum(amount) >=5000) %>%
     group_by(sender, reciever) %>% filter(sum(amount) >= 5000)
# A tibble: 2 x 3
# Groups:   sender, reciever [1]
#  sender reciever amount
#  <chr>  <chr>     <dbl>
#1 tom    ryan        200
#2 tom    ryan       5200