Найти повторения в парах, распределенных в 2 столбцах data.frame

Допустим, нужно найти частоты для каждой пары:

Например. Mark -Maria появляется три раза, а остальные один раз

Name1   Name2
Mark    Maria
John    Xesca
Steve   Rose
Mark    Maria
John    John
Mark    Maria
John    Xesca

Какой лучший способ выполнить это? Примите во внимание, что это частоты для обоих элементов. Я думаю, что это сложнее, чем ожидалось... Заранее спасибо,

3 ответа

Если вам нужно учесть порядок имен name1 и name2:

subset(as.data.frame(table(df)), Freq > 0)

#    Name1 Name2 Freq
# 1   John  John    1
# 5   Mark Maria    3
# 9  Steve  Rose    1
# 10  John Xesca    2

На самом деле вам даже не нужно вставлять, просто группа:

dat %>% 
  group_by(Name1, Name2) %>% 
  count()
# # A tibble: 4 x 3
# # Groups:   Name1, Name2 [4]
# Name1 Name2     n
# <fct> <fct> <int>
# 1 John  John      1
# 2 John  Xesca     2
# 3 Mark  Maria     3
# 4 Steve Rose      1

Вы можете paste0 вместе столбцы тогда count с dplyr:

library(dplyr)
dat %>% 
  mutate(pasted = paste0(Name1,Name2)) %>% 
  group_by(pasted) %>% 
  count()
# # A tibble: 4 x 2
# # Groups:   pasted [4]
# pasted        n
# <chr>     <int>
# 1 JohnJohn      1
# 2 JohnXesca     2
# 3 MarkMaria     3
# 4 SteveRose     1

Обратите внимание, что JohnXesca будет рассматриваться как отличается от XescaJohn,

Данные:

tt <- "Name1   Name2
Mark    Maria
John    Xesca
Steve   Rose
Mark    Maria
John    John
Mark    Maria
John    Xesca"

dat <- read.table(text=tt, header = T)

Мы перебираем строки набора данных, sort а также paste это вместе, а затем получить частоту с table

table(apply(df1, 1, function(x) paste(sort(x), collapse='-')))
#    John-John John-Xesca Maria-Mark Rose-Steve 
#        1          2          3          1 

данные

df1 <- structure(list(Name1 = c("Mark", "John", "Steve", "Mark", "John", 
 "Mark", "John"), Name2 = c("Maria", "Xesca", "Rose", "Maria", 
 "John", "Maria", "Xesca")), class = "data.frame", row.names = c(NA, 
 -7L))
Другие вопросы по тегам