Цикл R для создания нескольких сводных таблиц и графиков

#r #loops #for-loop

Вопрос:

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

Ниже показано, как выглядит мой набор данных. Есть три дихотомические переменные (x1,x2,x3), которые я хочу построить, и одна переменная, указывающая на группу.

 data lt;- data.frame(group = sample(c("Tesla", "Niro", "Leaf"), 50, replace=TRUE, prob=c(0.40, 0.20, 0.40)), x1 = rbinom(n=50, size=1, prob=0.3), x2 = rbinom(n=50, size=1, prob=0.5),   x3 = rbinom(n=50, size=1, prob=0.5))  

Чтобы построить процент наблюдений со значением 1, я немного повозился с данными, чтобы получить сводную таблицу, и построил сводную таблицу.

 summary lt;- data %gt;%   group_by(group) %gt;%  summarise(Obs = n()) ## gets the number of observations in each group   x1 lt;- data %gt;%   filter(x1 == 1) %gt;%  group_by(group) %gt;%  summarise(Freq = n()) ## counts the number of observations with value 1 in each group   ## make dataframe  x1_df lt;- left_join((summary), x1, by = "group") ## combines the two dataframe above   ## create percentage  x1_df lt;- x1_df %gt;% mutate(Percentage = Freq/Obs*100) ## calculates the percentage of 1 in each group   # create a variable that indicates a specific group  x1_df lt;- x1_df %gt;% mutate(Tesla = as.factor(ifelse(group == "Tesla", 1, 0))) # want to color a certain group (i.e., Tesla) in a different color in a graph   png("g_x1.png") g_x1 lt;- ggbarplot(subset(x1_df, !is.na(Percentage)), x = "group", y = "Percentage",  fill = "Tesla", # change fill color by cyl  # color = "white", # Set bar border colors to white  palette = "grey", # jco journal color palett. see ?ggpar  sort.val = "desc", # Sort the value in dscending order  sort.by.groups = FALSE, # Don't sort inside each group  x.text.angle = 90 # Rotate vertically x axis texts )  print(g_x1) dev.off()  

Результатом является следующий график.
[1]: https://i.stack.imgur.com/0xidT.png

Я хочу сделать то же самое и получить график для x2, x3 и многих других. Я провел некоторый поиск, и, похоже, я могу использовать либо для loop, либо для lapply. Но я не видел попытки сохранить зацикленный вывод в отдельных кадрах данных.

Вот как я об этом думаю.

 ## summary table of observations  summary lt;- data %gt;%   group_by(group) %gt;%  summarise(Obs = n())  summary lt;- summary %gt;%   add_column(x1 = NA,   x2 = NA,   x3 = NA)  for(i in 1:ncol(data)){  summary[,i 1] lt;- data[,i 1] %gt;%  filter(data[,i 1] == 1) %gt;%  group_by(group) %gt;%  summarize(Freq = n()) }  

Но это не работает и выдает эту ошибку «Ошибка: неожиданная «}» в «}»

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

1. Вы могли бы рассмотреть возможность использования списка data.frames и сохранения зацикленных выходных данных в этом списке.