преобразование tibble в цикле for

#r #data-wrangling

#r #перебор данных

Вопрос:

у меня есть этот фрейм данных :

 #create reprex data
tested_data <- tibble(STYL1 = c(1,2,3,1,2), STYL2 = c(2,2,3,1,4), STYL3 = c(4,2,4,1,3))
  

И я хочу иметь количество строк для каждого числа для STYL1, и я делаю это :

 tested_data %>% 
  group_by(STYL1) %>% 
  count() %>% 
  ungroup()
  

и это работает отлично, у меня есть это :

 # A tibble: 3 x 2
  STYL1     n
  <dbl> <int>
1     1     2
2     2     2
3     3     1
  

Но я хочу добавить цикл for, чтобы сделать это для каждой переменной типа … вот так (я хочу добавить в книгу Excel каждый фрейм данных один под другим с помощью пакета openxlsx):

 list <- c("STYL1","STYL2","STYL3")
for (tempo_variable in list) {
  dt <- tested_data %>% 
    group_by(tempo_variable) %>% 
    count() %>% 
    ungroup()
}
  

для меня важно создать цикл, потому что я не знаю, сколько у меня будет СТИЛ … переменных, и я должен выполнить эту задачу для каждой СТИЛ … переменной.
У кого-нибудь есть идея, как это сделать? Может быть, мне не нужно использовать цикл for ?
Пожалуйста, помогите мне!

Ответ №1:

Может быть, попробовать что-то подобное?

 lapply(c("STYL1", "STYL2", "STYL3"), function(x, df) df %>% group_by(across(!!x)) %>% count() %>% ungroup(), tested_data)
  

Комментарии:

1. Спасибо, что помогли мне, но мой R не знает функции across. из какого пакета оно взято?

2. Вам необходимо обновить свой dplyr пакет. Смотрите Этот веб- сайт для получения дополнительной информации

Ответ №2:

Вы можете привести данные в tidyr::pivot_longer порядок, а затем сгруппировать по обоим столбцам в выходных данных.

 library(tidyverse)

tested_data <- tibble(STYL1 = c(1,2,3,1,2), STYL2 = c(2,2,3,1,4), STYL3 = c(4,2,4,1,3))

tested_data %>% 
  pivot_longer(everything(), names_to = "STYL", values_to = "values") %>% 
  group_by(STYL, values) %>% 
  count()
#> # A tibble: 11 x 3
#> # Groups:   STYL, values [11]
#>    STYL  values     n
#>    <chr>  <dbl> <int>
#>  1 STYL1      1     2
#>  2 STYL1      2     2
#>  3 STYL1      3     1
#>  4 STYL2      1     1
#>  5 STYL2      2     2
#>  6 STYL2      3     1
#>  7 STYL2      4     1
#>  8 STYL3      1     1
#>  9 STYL3      2     1
#> 10 STYL3      3     1
#> 11 STYL3      4     2
  

Создано 2020-10-19 пакетом reprex (версия 0.3.0)