Найти повторения в парах, распределенных в 2 столбцах data.frame - PullRequest
0 голосов
/ 13 декабря 2018

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

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

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)
0 голосов
/ 13 декабря 2018

Если вам необходимо учесть порядок имени1 и имени2:

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
0 голосов
/ 13 декабря 2018

Мы перебираем строки набора данных, 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))
...