Частота строк кадра данных, игнорирующая порядок столбцов в R - PullRequest
2 голосов
/ 29 марта 2019

Я хочу построить таблицу частот для строк фрейма данных.

Я нашел, как это сделать, но с учетом порядка столбцов. Я хочу найти частоты, игнорирующие порядок столбцов.

В качестве примера для:

0   A       B     
1   B       A     
2   C       D      
3   D       C     
4   C       D

Я хочу получить:

A B 2
C D 3

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 29 марта 2019
library("tidyverse")

x <- read.table(
  text = "0   A       B
          1   B       A
          2   C       D
          3   D       C
          4   C       D",
  stringsAsFactors = FALSE)

x %>%
  # Specify the columns to combine explicitly (here V2 and V3)
  # Then sort each pair and paste it into a single string
  mutate(pair = pmap_chr(list(V2, V3),
                         function(...) paste(sort(c(...)), collapse = " "))) %>%
  count(pair)
#> # A tibble: 2 x 2
#>   pair      n
#>   <chr> <int>
#> 1 A B       2
#> 2 C D       3

Создано в 2019-03-29 пакетом представ. (v0.2.1)

1 голос
/ 29 марта 2019

Мы можем использовать pmin/pmax для создания группирующей переменной и должны быть более эффективными

library(dplyr)
df %>%
   count(V2N = pmin(V2, V3), V3N = pmax(V2, V3))
# A tibble: 2 x 3
#  V2N   V3N       n
#   <chr> <chr> <int>
#1 A     B         2
#2 C     D         3

Тесты

df1 <- df[rep(seq_len(nrow(df)), 1e6),]
system.time({

df1 %>%
       count(V2N = pmin(V2, V3), V3N = pmax(V2, V3))

 })
#user  system elapsed 
#  1.164   0.043   1.203 


system.time({
df2 <- data.frame(t(apply(df1[-1], 1, sort)))

df2 %>%
   group_by_all() %>%
   summarise(Freq = n())

   })

#   user  system elapsed 
# 160.357   1.227 161.544 

data

df <- structure(list(V1 = 0:4, V2 = c("A", "B", "C", "D", "C"), V3 = c("B", 
  "A", "D", "C", "D")), row.names = c(NA, -5L), class = "data.frame")
1 голос
/ 29 марта 2019

Сначала sort это построчно, а затем сгруппировать по всем столбцам и подсчитать количество строк.

library(dplyr)
df1 <- data.frame(t(apply(df[-1], 1, sort)))

df1 %>%
   group_by_all() %>%
   summarise(Freq = n())

 #   X1    X2     Freq
 #   <fct> <fct> <int>
 #1  A     B         2
 #2  C     D         3

data

df <- structure(list(V1 = 0:4, V2 = structure(c(1L, 2L, 3L, 4L, 3L), 
.Label = c("A", 
"B", "C", "D"), class = "factor"), V3 = structure(c(2L, 1L, 4L, 
3L, 4L), .Label = c("A", "B", "C", "D"), class = "factor")), class = 
"data.frame", row.names = c(NA, 
-5L))
...