Цикл For для заполнения определенных ячеек во фрейме данных (большой набор данных)

avatar
Charalampos Spanias
8 августа 2021 в 19:23
39
1
0

версия R версия 4.0.5 (31 марта 2021 г.) ОС Windows 10 x64
система x86_64, mingw32
Пользовательский интерфейс RStudio
язык (EN)
сопоставить English_United Kingdom.1252 ctype English_United Kingdom.1252 tz Европа/Лондон
Дата 2021-08-08

Всем привет,

Я пытаюсь вычислить некоторые переменные во фрейме данных, импортированном из Excel, но мне не хватает чего-то, чего я не могу найти. Я предполагаю, что это довольно специфическая ситуация, так как мой поиск в учебниках на YouTube по «циклу», постам StackOverflow и Google в целом пока не помог. Таким образом, я подумал о публикации в качестве последнего средства, чтобы найти решение от более опытных программистов.

У меня есть набор данных с 1392 строками и несколькими столбцами:

> summary(twente_1)
 Player.Number   Playing.Position       Date                Week      Training.type      Total.Distance 
 Min.   : 1.00   Length:3192        Length:3192        Min.   : 1.0   Length:3192        Min.   :    0  
 1st Qu.: 3.75   Class :character   Class :character   1st Qu.:10.0   Class :character   1st Qu.:    0  
 Median : 7.00   Mode  :character   Mode  :character   Median :19.5   Mode  :character   Median : 3669  
 Mean   : 9.25                                         Mean   :19.5                      Mean   : 3757  
 3rd Qu.:15.50                                         3rd Qu.:29.0                      3rd Qu.: 5500  
 Max.   :19.00                                         Max.   :38.0                      Max.   :19226  
 NA's   :3180                                          NA's   :2736                                     
      HSR             SD         High.Intensity.Actions..acc.dec.  Player.Load     SUM.Weekly.Total.Distance
 Min.   :   0   Min.   :  0.00   Min.   : 0.00                    Min.   :   0.0   Min.   :    0            
 1st Qu.:   0   1st Qu.:  0.00   1st Qu.: 0.00                    1st Qu.:   0.0   1st Qu.:21304            
 Median :  22   Median :  0.00   Median :12.00                    Median :  89.0   Median :27969            
 Mean   : 123   Mean   : 23.21   Mean   :15.18                    Mean   : 191.2   Mean   :26298            
 3rd Qu.: 168   3rd Qu.: 20.00   3rd Qu.:24.00                    3rd Qu.: 240.0   3rd Qu.:32727            
 Max.   :1590   Max.   :475.00   Max.   :90.00                    Max.   :1777.0   Max.   :50194            
                                                                                   NA's   :2736             
    SUM.HSR           SUM.SD        SUM.ACC.DEC    SUM.Player.Load Daily.Mean     St.Deviation  
 Min.   :   0.0   Min.   :  0.00   Min.   :  0.0   Min.   :   0    Mode:logical   Mode:logical  
 1st Qu.: 552.0   1st Qu.: 57.25   1st Qu.: 67.0   1st Qu.: 876    NA's:3192      NA's:3192     
 Median : 843.5   Median :142.00   Median :104.0   Median :1318                                 
 Mean   : 861.0   Mean   :162.50   Mean   :106.3   Mean   :1339                                 
 3rd Qu.:1164.2   3rd Qu.:235.00   3rd Qu.:147.0   3rd Qu.:1799                                 
 Max.   :3504.0   Max.   :711.00   Max.   :259.0   Max.   :3373                                 
 NA's   :2736     NA's   :2736     NA's   :2736    NA's   :2736                                 
 Monotony.Total.Distance Monotony.HSR   Monotony.SD    Monotony.High.Intensity.Actions Monotony.Player.Load
 Mode:logical            Mode:logical   Mode:logical   Mode:logical                    Mode:logical        
 NA's:3192               NA's:3192      NA's:3192      NA's:3192                       NA's:3192           
                                                                                                           
                                                                                                           
                                                                                                           
                                                                                                           
                                                                                                           
 Strain.Total.Distance Strain.HSR     Strain.SD      Strain.High.Intensity.Actions Strain.Player.Load
 Mode:logical          Mode:logical   Mode:logical   Mode:logical                  Mode:logical      
 NA's:3192             NA's:3192      NA's:3192      NA's:3192                     NA's:3192
> head(twente_1)
  Player.Number Playing.Position       Date Week Training.type Total.Distance HSR  SD
1             1               ED 11/08/2018    1         'OFF'              0   0   0
2            NA                  12/08/2018   NA         'OFF'              0   0   0
3            NA                  13/08/2018   NA          'TT'           4599  72   0
4            NA                  14/08/2018   NA          'TT'           6328 213 104
5            NA                  15/08/2018   NA          'TT'           5522 264  22
6            NA                  16/08/2018   NA          'TT'           2873  14   0
  High.Intensity.Actions..acc.dec. Player.Load SUM.Weekly.Total.Distance SUM.HSR SUM.SD SUM.ACC.DEC
1                                0           0                     31953    1205    298         113
2                                0           0                        NA      NA     NA          NA
3                               16         141                        NA      NA     NA          NA
4                               25         362                        NA      NA     NA          NA
5                               15         283                        NA      NA     NA          NA
6                               16          66                        NA      NA     NA          NA
  SUM.Player.Load Daily.Mean St.Deviation Monotony.Total.Distance Monotony.HSR Monotony.SD
1            1843         NA           NA                      NA           NA          NA
2              NA         NA           NA                      NA           NA          NA
3              NA         NA           NA                      NA           NA          NA
4              NA         NA           NA                      NA           NA          NA
5              NA         NA           NA                      NA           NA          NA
6              NA         NA           NA                      NA           NA          NA
  Monotony.High.Intensity.Actions Monotony.Player.Load Strain.Total.Distance Strain.HSR Strain.SD
1                              NA                   NA                    NA         NA        NA
2                              NA                   NA                    NA         NA        NA
3                              NA                   NA                    NA         NA        NA
4                              NA                   NA                    NA         NA        NA
5                              NA                   NA                    NA         NA        NA
6                              NA                   NA                    NA         NA        NA
  Strain.High.Intensity.Actions Strain.Player.Load player_load_sd
1                            NA                 NA             NA
2                            NA                 NA             NA
3                            NA                 NA             NA
4                            NA                 NA             NA
5                            NA                 NA             NA
6                            NA                 NA             NA

Я хочу создать вычисление некоторых новых переменных и сохранить их в определенных ячейках. Например, я хочу найти стандартное отклонение каждой недели (всего 1392 строки, то есть 456 недель).

Я "придумал" код, чтобы сделать это вручную:

twente_1$player_load_sd[1] = sd(twente_1$Player.Load[1:7])
twente_1$player_load_sd[2] = sd(twente_1$Player.Load[8:14])
twente_1$player_load_sd[3] = sd(twente_1$Player.Load[15:21])
twente_1$player_load_sd[4] = sd(twente_1$Player.Load[22:28])
twente_1$player_load_sd[5] = sd(twente_1$Player.Load[29:35])
twente_1$player_load_sd[6] = sd(twente_1$Player.Load[36:42])
twente_1$player_load_sd[7] = sd(twente_1$Player.Load[43:49])
twente_1$player_load_sd[8] = sd(twente_1$Player.Load[50:56])
twente_1$player_load_sd[9] = sd(twente_1$Player.Load[57:63])
twente_1$player_load_sd[10] = sd(twente_1$Player.Load[64:70])

Я уверен, что могу сделать это с помощью "цикла for", но у меня не получается. Я попробовал код ниже, но он дает мне NA:

x <- 1
y <- 7
for (i in 1:456) {
        twente_1$player_load_sd[i] = sd(twente_1$Player.Load[x:y])
        x <- x+7
        y <- y+7
}

Заранее спасибо за ваше время и помощь.

Источник

Ответы (1)

avatar
Jacob Rothschild
8 августа 2021 в 20:09
0

Вместо цикла for я бы 1) создал недельную переменную, 2) сгруппировал набор данных по неделям и 3) вычислил стандартное отклонение для каждой недели, используя сгруппированный набор данных. Вот как это будет выглядеть:

Вот образец набора данных, состоящий из данных за 10 недель. (Установите библиотеку tidyverse, если у вас ее еще нет.)

library(tidyverse)
df <- tibble(
  day = 1:70,
  x = runif(70, 0, 100)
)

Во-первых, давайте создадим недельную переменную, поместив строки в группы по 7.

df <- 
  df %>% 
  mutate(
    week = rep(1:(nrow(df)/7), each = 7)
  )

Далее сгруппируйте набор данных по неделям и рассчитайте стандартное отклонение x. Не забудьте разгруппировать в конце!

df <- 
  df %>% 
  group_by(week) %>% 
  mutate(week_sd = sd(x)) %>% 
  ungroup()

Мы можем просмотреть первые 14 дней (т.е. две недели), чтобы увидеть, что стандартное отклонение для каждой недели сохраняется в каждой отдельной строке.

head(df, 14)

Если вам нужен новый набор данных с одной строкой в ​​неделю, вместо этого вы можете сгруппировать и суммировать:

df_week <- 
  df %>% 
  group_by(week) %>% 
  summarize(week_sd = sd(x)) %>% 
  ungroup()

df_week
Charalampos Spanias
8 августа 2021 в 21:14
0

Это потрясающе @Jacob! Большое спасибо за это, я действительно очень ценю это! Я попробовал себя сейчас и работает отлично. Вы спаситель!