Выберите наиболее распространенное значение столбца на основе сопоставленных пар из двух столбцов, используя `ddply` - PullRequest
1 голос
/ 12 апреля 2019

Я пытаюсь использовать ddply (функция plyr) для сортировки и определения наиболее частого типа взаимодействия между любыми уникальными парами пользователей из данных социальных сетей следующей формы

from <- c('A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'D', 'D', 'D', 'D')
to <- c('B', 'B', 'D', 'A', 'C', 'C', 'D', 'A', 'D', 'B', 'A', 'B', 'B', 'A', 'C')
interaction_type <- c('like', 'comment', 'share', 'like', 'like', 'like', 'comment', 'like', 'like', 'share', 'like', 'comment', 'like', 'share', 'like')

dat <- data.frame(from, to, interaction_type)

, который при правильной агрегации должен находить наиболее распространенный тип взаимодействия между любыми уникальными парами (независимо от направленности (то есть A -> B, A <- B)), как это </p>

from    to  type
A       B   like
A       C   like
A       D   share
B       C   like
B       D   comment
C       D   like

Несмотря на то, что с помощью

можно легко получить общее количество взаимодействий между любыми двумя пользователями.
count <- ddply(sub_test, .(from, to), nrow)

Мне было трудно применить подобный метод, чтобы найти наиболее распространенный тип взаимодействия между любыми заданными парами с этим методом агрегации. Каков будет самый эффективный способ достичь желаемого результата? Кроме того, как обращаться с возможными "связанными" случаями? (Я мог бы просто использовать "tided" в качестве значений ячеек для всех связанных случаев).

Ответы [ 2 ]

2 голосов
/ 12 апреля 2019

Аналогично подходу Ронака

library(dplyr)
dat <- data.frame(from, to, interaction_type, stringsAsFactors = F)
dat %>% 
  mutate(
    pair = purrr::pmap_chr(
      .l = list(from = from, to = to),
      .f = function(from, to) paste(sort(c(from, to)), collapse = "")
    )
  ) %>%
  group_by(pair) %>%
  filter(n() == max(n()) & row_number() == 1) %>%
  ungroup() %>%
  select(-pair)
# A tibble: 6 x 3
  from  to    interaction_type
  <chr> <chr> <chr>           
1 A     B     like            
2 A     D     share           
3 B     C     like            
4 B     D     comment         
5 C     A     like            
6 C     D     like
2 голосов
/ 12 апреля 2019

Нам нужно найти наиболее распространенное значение (режим) для каждой группы независимо от порядка столбцов from, to.

Получение функции Mode из этого ответа

Mode <- function(x) {
   ux <- unique(x)
   ux[which.max(tabulate(match(x, ux)))]
}

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

library(dplyr)

dat %>%
  mutate(key = paste0(pmin(from, to), pmax(from, to), sep = "")) %>%
  group_by(key) %>%
  mutate(interaction_type = Mode(interaction_type)) %>%
  slice(1) %>%
  ungroup() %>%
  select(-key)

#  from  to    interaction_type
#  <chr> <chr> <chr>           
#1 A     B     like            
#2 C     A     like            
#3 A     D     share           
#4 B     C     like            
#5 B     D     comment         
#6 C     D     like     

Сохраняйте столбцы как символы, добавляя stringsAsFactors = FALSE в свои данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...