Пользовательская функция для создания уникальных значений выбранных переменных - PullRequest
2 голосов
/ 10 января 2020

Я написал простую пользовательскую функцию для получения уникальных значений данного столбца, например:

 > get.values <- function(df, colNamestr) {
      df %>%
      select(colNamestr) %>%
      distinct()
 }

Пример данных следующим образом:

myData <- data.frame(
    variable1 = c("cat", "cat", "dog"), 
    variable2 = c("yes", "no", "maybe"),
    variable3 = c("yellow", "yellow", "white")
)

Когда я запускаю работает следующим образом:

get.values(myData, 'variable1') ... result is:
  variable1
1       cat
2       dog

Я хочу расширить эту функцию, чтобы я мог вызывать сразу несколько имен столбцов (около 15) (мои фактические данные содержат 2000 столбцов) и выводить кадр данных со всеми уникальные значения переменных, таких как это.

get.values(myData, c('variable1', 'variable2', 'variable3')
     variable1  variable2 variable3
    1       cat  yes      yellow
    2       dog  no       white
    3            maybe

Любые предложения будут с благодарностью!

Ответы [ 4 ]

3 голосов
/ 10 января 2020

Здесь мы можем использовать map

library(purrr)
map(names(myData), get.values, df = myData) %>%
      reduce(rowr::cbind.fill, fill = "")
#    variable1 variable2 variable3
#1       cat       yes    yellow
#2       dog        no     white
#3               maybe          
1 голос
/ 10 января 2020

Мы можем select столбцы colNamestr, использовать unique, чтобы получить уникальные значения из каждого из этих столбцов, добавить NA s к столбцам с более короткой длиной и связать их вместе.

library(tidyverse)

get.values <- function(df, colNamestr) {
  map(myData %>% select(colNamestr), unique) %>% map_dfc(`[`, 1:max(lengths(.)))  
}

get.values(myData, 'variable1')
#  variable1
#  <fct>    
#1 cat      
#2 dog      

get.values(myData, c('variable1', 'variable2'))

# variable1 variable2
#  <fct>     <fct>    
#1 cat       yes      
#2 dog       no       
#3 NA        maybe    

Если вы хотите применить это к нескольким столбцам, вы можете использовать нестандартную оценку

get.values <- function(df, colNamestr) {
  map(myData %>% select({{colNamestr}}), unique) %>% map_dfc(`[`, 1:max(lengths(.)))  
}

и диапазон передачи столбцов

get.values(myData, variable1:variable3)

#  variable1 variable2 variable3
#  <fct>     <fct>     <fct>    
#1 cat       yes       yellow   
#2 dog       no        white    
#3 NA        maybe     NA       
1 голос
/ 10 января 2020

Вы можете использовать функции select_at

library(tidyverse)
myData <- data.frame(variable1=c("cat", "cat", "dog"), variable2=c("yes", "no", "maybe"), variable3=c("yellow", "yellow", "white"))


get.values <- function(df, colNamestr) {
  df %>%
    select_at(colNamestr) %>%
    distinct()
}

myData %>% 
get.values(vars(everything()))
#>   variable1 variable2 variable3
#> 1       cat       yes    yellow
#> 2       cat        no    yellow
#> 3       dog     maybe     white

Создано в 2020-01-09 пакетом Представить (v0.3.0)

Хорошо, что теперь ваша функция работает с выбранными помощниками, просто окружите нужные переменные vars()

0 голосов
/ 10 января 2020

Сохраняя вещи в пределах tidyverse , мы можем переписать вашу функцию, чтобы воспользоваться преимуществами квазиквотации:

get.values <- function(df, ...) {

  cols <- enquos(...)

  df %>% 
    select(!!!cols) %>% 
    distinct() %>% 
    mutate_all(as.character) %>% 
    mutate_all(~ifelse(duplicated(.), ' ', .)) %>% 
    mutate_all(~rev(sort(.)))
}

Здесь get.values ожидает получения фрейма данных, за которым следует любое количество имен столбцов (в кавычках или без кавычек). Использование enquos позволяет нам использовать все грамматики выбора tidyverse:

myData <- data.frame(variable1=c("cat", "cat", "dog"), variable2=c("yes", "no", "maybe"), variable3=c("yellow", "yellow", "white"))

get.values(myData, variable1)

  variable1
1       dog
2       cat

get.values(myData, variable1, variable2)

  variable1 variable2
1       dog       yes
2       cat        no
3               maybe

# Using strings works just fine:
get.values(myData, c('variable1', 'variable2'))

  variable1 variable2
1       dog       yes
2       cat        no
3               maybe

get.values(myData, variable1:variable3)

  variable1 variable2 variable3
1       dog       yes    yellow
2       cat        no     white
3               maybe          

get.values(myData, ends_with('2'))

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