R цикл через несколько подгрупп с использованием функций - PullRequest
0 голосов
/ 11 июня 2018

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

Мои данные выглядят следующим образом:

Event = c(1,1,1,1,1,2,2,2,2,2)
Indiv1=c(4,5,6,11,45,66,8,9,32,45)
Indiv2=c(7,81,91,67,12,34,56,78,90,12)
Category=c(1,1,2,2,2,1,2,2,1,1) 
Play_together=c(1,0,1,1,1,1,1,1,0,1)
Money=c(23,11,78,-9,-12,345,09,43,21,90)
z = data.frame(Event,Indiv1,Indiv2,Category,Play_together,Money)

Что я хотел бы сделать, это просмотреть каждое событие и каждую категорию и взять среднее значение денег в тех случаях, когда Play_together ==1. Когда Play_together == 0, я хотел бы применить Money / 100.

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

 for i in 1:nrow(z){
     #loop for event{
         #loop for Category{
              #Define avg or division function
         }
     }
 }

Однако я не могу показатьсяреализовать это с помощью вложенного цикла.Я видел другой пост (ссылка: применить функцию для каждой подгруппы ), который использует пакет dplyr.Мне было интересно, может ли кто-нибудь помочь мне реализовать это без использования каких-либо пакетов (я знаю, что это может занять больше времени по сравнению с использованием пакетов R).Я пытаюсь изучить R, и это первый раз, когда я работаю с вложенными циклами.

Конечный результат будет выглядеть так: enter image description here

гдедля события 1 выполняется следующее:

a) Для группы 1:

Play_together == 1 в строке 1;мы берем среднее значение денег и, следовательно, конечный результат = 23/1 = 23

Play_together == 0 в строке 2;мы берем Money / 100 = 0,11

b) Для категории 2: Play_together == 1 для всех наблюдений.Мы берем средние деньги за все три наблюдения.

То же самое относится и к событию 2. В моем фактическом наборе данных у меня есть событие = 600 и количество категорий в диапазоне от 1 до 10. Некоторые события могут иметь только 1 категорию и максимум 10 категорий.Поэтому любая функция должна быть чрезвычайно гибкой.Общее количество наблюдений в моем наборе данных составляет около 1,5 миллионов, поэтому любые изменения в циклическом процессе для сокращения времени, необходимого для выполнения операции, будут чрезвычайно полезными (хотя на данном этапе моим приоритетом является сам процесс циклического анализа).

Еще раз было бы очень полезно, если бы вы могли показать мне, как использовать вложенные циклы, и кратко объяснить шаги.Очень ценится.

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Рассмотрим базовые R by, объектно-ориентированную оболочку для tapply, предназначенную для подмножества фреймов данных по факторам, но в отличие от split может передавать подмножества в определенную функцию.Затем запустите условную логику с полем ifelse для Final_Output .Наконец, сложите все подмножественные кадры данных для конечного объекта.

# LIST OF DATAFRAMES
by_list <- by(z, z[c("Event", "Category")], function(sub) {      
  tmp <- subset(sub, Play_together==1)
  sub$Final_Output <- ifelse(sub$Play_together == 1, mean(tmp$Money), sub$Money/100)
  return(sub)      
})

# APPEND ALL DATAFRAMES
final_df <- do.call(rbind, by_list)    
row.names(final_df) <- NULL

final_df 
#    Event Indiv1 Indiv2 Category Play_together Money Final_Output
# 1      1      4      7        1             1    23        23.00
# 2      1      5     81        1             0    11         0.11
# 3      2     66     34        1             1   345       217.50
# 4      2     32     90        1             0    21         0.21
# 5      2     45     12        1             1    90       217.50
# 6      1      6     91        2             1    78        19.00
# 7      1     11     67        2             1    -9        19.00
# 8      1     45     12        2             1   -12        19.00
# 9      2      8     56        2             1     9        26.00
# 10     2      9     78        2             1    43        26.00
0 голосов
/ 11 июня 2018

будет ли что-то подобное делать?Я знаю, что он использует dplyr, но этот пакет сделан для такого рода работ; -)

Event = c(1,1,1,1,1,2,2,2,2,2)
Indiv1=c(4,5,6,11,45,66,8,9,32,45)
Indiv2=c(7,81,91,67,12,34,56,78,90,12)
Category=c(1,1,2,2,2,1,2,2,1,1) 
Play_together=c(1,0,1,1,1,1,1,1,0,1)
Money=c(23,11,78,-9,-12,345,09,43,21,90)
z = data.frame(Event,Indiv1,Indiv2,Category,Play_together,Money)

library(dplyr)

df_temp <- z %>%
  group_by( Event, Category, Play_together ) %>%
  summarise( money_mean = mean( Money ) ) %>%
  mutate( final_output = ifelse( Play_together == 0, money_mean / 100, money_mean )) %>%
  select( -money_mean )

df <- z %>%
  left_join(df_temp, by = c("Event", "Category", "Play_together" )) %>%
  arrange(Event, Category)
...