Развернуть до бланка с гнездами - PullRequest
2 голосов
/ 29 февраля 2020

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

Например, с помощью этого кода:

library(tidyverse)
data <- data.frame(
  group1 = sample(c('dog','cat', 'gecko'), 100, replace = T),
  group2 = sample(c('hot dog', 'not hotdog', 'other'), 100, replace = T)
)

my_freq <- function(var){
  result <- as.data.frame(table(data[[var]]))
  colnames(result) <- c('level', 'n')
  return(result)
}

the_table <- data.frame(var = c('group1', 'group2'))
the_table <- the_table %>% 
  mutate(
    result = map(var, my_freq)
  ) %>% 
  unnest(result)

Вместо результирующей таблицы, выглядящей так:

enter image description here

Это будет выглядеть так:

enter image description here

Полагаю, это будет многоуровневый индекс в , но не уверен, как это сделать sh в .

Ответы [ 3 ]

1 голос
/ 02 марта 2020

Расширение решения rmagno на другие переменные высокого порядка

...%>%
  mutate_at(
    .vars = vars(high_order_vars),
    .funs = function(x) ifelse(duplicated(.[['var']]), NA, x)
  )
0 голосов
/ 29 февраля 2020

Не уверен, что вы подразумеваете под пустым (в этом примере я иду с NA). Критическая строка:

mutate(var = if_else(!duplicated(var), var, NA_integer_))

Минимальный рабочий пример:

library(tidyverse)
data <- data.frame(
  group1 = sample(c('dog','cat', 'gecko'), 100, replace = T),
  group2 = sample(c('hot dog', 'not hotdog', 'other'), 100, replace = T)
)

my_freq <- function(var){
  result <- as.data.frame(table(data[[var]]))
  colnames(result) <- c('level', 'n')
  return(result)
}

the_table <- data.frame(var = c('group1', 'group2'))
the_table <- the_table %>% 
  mutate(
    result = map(var, my_freq)
  ) %>% 
  unnest(result) %>%
  mutate(var = if_else(!duplicated(var), var, NA_integer_))

the_table
#> # A tibble: 6 x 3
#>   var    level          n
#>   <fct>  <fct>      <int>
#> 1 group1 cat           38
#> 2 <NA>   dog           38
#> 3 <NA>   gecko         24
#> 4 group2 hot dog       36
#> 5 <NA>   not hotdog    34
#> 6 <NA>   other         30

Создано в 2020-02-29 пакетом Представить (v0. 3,0)

0 голосов
/ 29 февраля 2020

Вы можете просто использовать lapply, чтобы получить список, который я называю tb из двух таблиц. Затем создайте matrix с names(tb) в первой строке, а остальные пропускайте и преобразуйте его во фрейм данных. Наконец, Map назначает нужные имена, последовательно применяя cbind к столбцам обоих фреймов данных.

tb <- lapply(data, function(x) setNames(as.data.frame(table(x)), c("level", "n")))
res <- do.call(rbind, 
               Map(cbind, 
                   var=data.frame(
                     matrix(c(names(tb), rep("", (el(lapply(tb, nrow)) - 1)*2)),
                            ncol=2, byrow=TRUE)), 
                   tb))
res
#         var      level  n
# X1.1 group1        cat 31
# X1.2               dog 26
# X1.3             gecko 43
# X2.1 group2    hot dog 35
# X2.2        not hotdog 37
# X2.3             other 28
...