DF2
Пусть это кадр данных, рассчитанный в my answer к prior post ссылается на вопрос, т.е. фрейма данных, имеющий AVG
столбца. Он также воспроизводится в примечании в конце этого ответа.
Если мы только что один или небольшое фиксированное число игроков, которых мы могли бы сделать это, выписав в AVG.*
столбец для каждого игрока (показан для одного игрока):
transform(DF2, AVG.S = ifelse(Player == "S", AVG, NA))
но более общий подход следующим образом. Установите levs
на уровень фактора Player
или если вы не хотите, чтобы все игроки, то levs
должен быть установлен в вектор символа только тех игроков, которых вы хотите. Затем используйте sapply
для конструирования логической матрицы и преобразования ее в матрицу из 1s и NA, которая затем скаляр умножается на AVG
.
Решение имеет ряд желательных функций - оно не перезаписывает его вход (который был бы подвержен ошибкам), и он избегает ненужной повторной квалификации (оба благодаря transform
), он использует весь объектный подход, а не циклы и subscriptip, он использует существующий код, избегая дублирования (используя результат предыдущего решения, что этот вопрос является продолжением) и является кратким - две строки кода. Он не использует пакеты.
(Также отметим, что в качестве альтернативы sapply(...)
можно заменить model.matrix(~ Player + 0)
в этом случае имена столбцов будет немного отличаться.)
levs <- levels(DF2$Player)
transform(DF2, Avg = ifelse(sapply(levs, `==`, Player), 1, NA) * AVG)
дает:
Player Goals AVG Avg.J Avg.O Avg.S
1 S 5 NA NA NA NA
2 S 2 5.000000 NA NA 5.000000
3 S 7 3.500000 NA NA 3.500000
4 O 3 NA NA NA NA
5 O 9 3.000000 NA 3.000000 NA
6 O 6 6.000000 NA 6.000000 NA
7 O 3 6.000000 NA 6.000000 NA
8 S 7 4.666667 NA NA 4.666667
9 O 1 5.250000 NA 5.250000 NA
10 S 7 5.250000 NA NA 5.250000
11 S 3 5.600000 NA NA 5.600000
12 O 8 4.400000 NA 4.400000 NA
13 S 3 5.166667 NA NA 5.166667
14 O 4 5.000000 NA 5.000000 NA
15 O 1 4.857143 NA 4.857143 NA
16 S 9 4.857143 NA NA 4.857143
17 S 4 5.375000 NA NA 5.375000
18 O 6 4.375000 NA 4.375000 NA
19 S 3 5.222222 NA NA 5.222222
20 O 8 4.555556 NA 4.555556 NA
21 S 3 5.000000 NA NA 5.000000
22 O 4 4.900000 NA 4.900000 NA
23 O 1 4.818182 NA 4.818182 NA
24 S 9 4.818182 NA NA 4.818182
25 S 4 5.166667 NA NA 5.166667
26 O 6 4.500000 NA 4.500000 NA
27 J 6 NA NA NA NA
Примечание: Эта использовался как ввод выше:
DF2 <- structure(list(Player = structure(c(3L, 3L, 3L, 2L, 2L, 2L, 2L,
3L, 2L, 3L, 3L, 2L, 3L, 2L, 2L, 3L, 3L, 2L, 3L, 2L, 3L, 2L, 2L,
3L, 3L, 2L, 1L), .Label = c("J", "O", "S"), class = "factor"),
Goals = c(5, 2, 7, 3, 9, 6, 3, 7, 1, 7, 3, 8, 3, 4, 1, 9,
4, 6, 3, 8, 3, 4, 1, 9, 4, 6, 6), AVG = c(NA, 5, 3.5, NA,
3, 6, 6, 4.66666666666667, 5.25, 5.25, 5.6, 4.4, 5.16666666666667,
5, 4.85714285714286, 4.85714285714286, 5.375, 4.375, 5.22222222222222,
4.55555555555556, 5, 4.9, 4.81818181818182, 4.81818181818182,
5.16666666666667, 4.5, NA)), .Names = c("Player", "Goals",
"AVG"), row.names = c(NA, -27L), class = "data.frame")
Я думаю, что это может быть более простым, если вы просто подмножаетесь на 3 кадра данных, вычисляете совокупное среднее, а затем рекомбинируете. – giraffehere
Не можете ли вы изменить данные в этом формате от предыдущего anwser? – mtoto
Кроме того, может помочь таяние и литье. Может быть, хорошо смотреть. – giraffehere