Какие () функции в фильтре () с dplyr - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь отфильтровать набор данных, а затем установить выбросы на среднее значение.Пример фрейма данных:

structure(list(INDEX = c(1, 2, 3, 4, 5, 6), TARGET_WINS = c(39, 
70, 86, 70, 82, 75), TEAM_BATTING_H = c(1445, 1339, 1377, 1387, 
1297, 1279), TEAM_BATTING_2B = c(194, 219, 232, 209, 186, 200
), TEAM_BATTING_3B = c(39, 22, 35, 38, 27, 36), TEAM_BATTING_HR = c(13, 
190, 137, 96, 102, 92), TEAM_BATTING_BB = c(143, 685, 602, 451, 
472, 443), TEAM_BATTING_SO = c(842, 1075, 917, 922, 920, 973), 
    TEAM_BASERUN_SB = c(NA, 37, 46, 43, 49, 107), TEAM_BASERUN_CS = c(NA, 
    28, 27, 30, 39, 59), TEAM_BATTING_HBP = c(NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_), TEAM_PITCHING_H = c(9364, 
    1347, 1377, 1396, 1297, 1279), TEAM_PITCHING_HR = c(84, 191, 
    137, 97, 102, 92), TEAM_PITCHING_BB = c(927, 689, 602, 454, 
    472, 443), TEAM_PITCHING_SO = c(5456, 1082, 917, 928, 920, 
    973), TEAM_FIELDING_E = c(1011, 193, 175, 164, 138, 123), 
    TEAM_FIELDING_DP = c(NA, 155, 153, 156, 168, 149)), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))

Используя dplyr, я фильтрую выбросы, затем пытаюсь изменить столбец TEAM_FIELDING_E на основе скорректированного (не выпадающего) среднего значения:

train %>% 
  filter(which(boxplot.stats(train$TEAM_FIELDING_E)$out %in% train$TEAM_FIELDING_E, arr.ind = TRUE) == TRUE) %>% 
  mutate(
    TEAM_FIELDING_E = NA,
    TEAM_FIELDING_E = mean(train$TEAM_FIELDING_E)
  )

Это возвращает ошибку Error in filter_impl(.data, quo) : Result must have length 2276, not 303 (исходный набор данных содержит 303 TEAM_FIELDING_E выбросов и 2276 строк).Как мне использовать filter(), чтобы мой mutate() влиял только на эти отфильтрованные строки?

1 Ответ

0 голосов
/ 21 января 2019

В глаголах dplyr используйте пустые имена переменных и не используйте [[ или $. Кроме того, если вы пытаетесь отфильтровать значение, вы можете просто отфильтровать значение напрямую, а не пытаться использовать which для определения позиции совпадения.

В этом случае вы можете получить то, что вы хотите, с if_else в пределах mutate.

out <- boxplot.stats(train$TEAM_FIELDING_E)$out

 train %>% 
  mutate(TEAM_FIELDING_E = if_else(TEAM_FIELDING_E %in% out, mean(TEAM_FIELDING_E[!(TEAM_FIELDING_E %in% out)]), TEAM_FIELDING_E))
...