Функция для логической таблицы - PullRequest
2 голосов
/ 04 октября 2019

Итак, у меня есть эта функция для логического вычисления (диаграммы Венна), но я не могу сделать функцию универсальной для любого кадра данных любого размера.

Эта функция работает только для предоставленного кадра данных (только четыре столбца)


how_much = 5000000
A <- sample(how_much, replace = TRUE, x = 1:5) 
B <- sample(how_much, replace = TRUE, x = 1:5)
C <- sample(how_much, replace = TRUE, x = 1:5)
D <- sample(how_much, replace = TRUE, x = 1:5)

VennData = data.table(A, B, C, D)


Venn_Counts <- function(dataset, unique_number, operator) {
  message("Operator arrgument are: `==` or`<` or `<=` or `>` or `>=`")
  if(inrange(unique_number, 1, 35) ){
    dataset %>% as_tibble() %>% 
      mutate(A = (operator(A, unique_number)),
             B = (operator(B, unique_number)),
             C = (operator(C, unique_number)), 
             D = (operator(D, unique_number))) %>%
      count(A, B, C, D)
  }
  else {
    print("Unique number must be in range from 1 to 5")
  }
}


Venn_Counts(VennData, 2, operator = `<=`)

как бы мы сделали вышеуказанную функцию универсальной для фрейма данных, в котором было бы больше столбцов?

для меньших объектов мы получили бы что-то вроде: установка аргументов unique_number = 3, operator = ==

count    A      B
 24     TRUE   TRUE
 20     TRUE   FALSE
 13     FALSE  TRUE
 43     FALSE  FALSE

когда мы можем видеть, что у нас есть 24 наблюдения, где A и B равно 3, 20 наблюдений имеют A, равное 3, и B не равно 3, 13 наблюдений имеют Aне равно 3, а B равно 3 и т. д.

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Как насчет использования ограниченных глаголов из dplyr:

library(data.table)
library(dplyr)

how_much = 5000000
A <- sample(how_much, replace = TRUE, x = 1:5) 
B <- sample(how_much, replace = TRUE, x = 1:5)
C <- sample(how_much, replace = TRUE, x = 1:5)
D <- sample(how_much, replace = TRUE, x = 1:5)

VennData = data.table(A, B, C, D)


Venn_Counts <- function(dataset, unique_number, operator) {
  message("Operator arrgument are: `==` or`<` or `<=` or `>` or `>=`")
  if(inrange(unique_number, 1, 35) ){
    dataset %>% 
      as_tibble() %>% 
      mutate_all( ~ operator(.x, unique_number)) %>%
      group_by_all() %>% 
      count()
  }
  else {
    print("Unique number must be in range from 1 to 5")
  }
}


Venn_Counts(VennData, 2, operator = `<=`)
0 голосов
/ 04 октября 2019

Мы могли бы сравнить dataset с operator напрямую и сгруппировать по всем столбцам и вычислить количество.

Venn_Counts <- function(dataset, unique_number, operator) {
    message("Operator arrgument are: `==` or`<` or `<=` or `>` or `>=`")
    if(inrange(unique_number, 1, 35) ){
       (operator(dataset, unique_number)) %>% 
        as_tibble() %>% 
        group_by_all() %>% 
        summarise(n = n())
       }
   else {
     print("Unique number must be in range from 1 to 5")
   }
}
Venn_Counts(VennData, 2, operator = `<=`)

#   A     B     C     D         n
#  <lgl> <lgl> <lgl> <lgl>  <int>
#1 FALSE FALSE FALSE FALSE     2
#2 FALSE FALSE FALSE TRUE      3
#3 FALSE TRUE  TRUE  FALSE     1
#4 TRUE  FALSE FALSE TRUE      2
#5 TRUE  FALSE TRUE  FALSE     1
#6 TRUE  TRUE  TRUE  TRUE      1

данные

library(data.table)
library(tidyverse)
set.seed(1234)
how_much = 10
A <- sample(how_much, replace = TRUE, x = 1:5) 
B <- sample(how_much, replace = TRUE, x = 1:5)
C <- sample(how_much, replace = TRUE, x = 1:5)
D <- sample(how_much, replace = TRUE, x = 1:5)
VennData = data.table(A, B, C, D)
...