#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)