Как создать новый фрейм данных с пользовательскими столбцами из другого фрейма данных на отфильтрованных данных для каждого столбца - PullRequest
0 голосов
/ 20 ноября 2018

Я пытался найти похожий вопрос, но не смог найти ничего похожего.

У меня есть фрейм данных df с сотнями строк и несколькими переменными.Первая переменная level , которая изменяется от 1 до 8.

Например:

df<- data.frame(level = c(1,1,1,2,2,3,4,5,6,7,8), CODE = c("1234", "3452", "1234", "7654","6547","6546", "7683", "6543", "7683", "6543", "7683"), ADD_ALLOW_MEAL = c(NA, "Y", "Y", "N", "N", NA, NA, "Y", "Y", "N", 'N'), ALLOW_MEALLOW = c(NA, 40, 60, NA, NA, NA, NA, 50, 70, NA, NA)) 

> df
   level     CODE ADD_ALLOW_MEAL     ALLOW_MEALLOW
1      1     1234           <NA>                NA
2      1     3452              Y                40
3      1     1234              Y                60
4      2     7654              N                NA
5      2     6547              N                NA
6      3     6546           <NA>                NA
7      4     7683           <NA>                NA
8      5     6543              Y                50
9      6     7683              Y                70
10     7     6543              N                NA
11     8     7683              N                NA

Мне нужно создать новые данныекадр, который будет иметь только 8 строк (8 уровней от df).Обычно я использовал бы просто:

df %>% 
  group_by(level) %>% 
  summarise()

Проблема в том, что мне нужно создать несколько очень пользовательских столбцов на отфильтрованных данных, все на уровне .

Пример:

df %>% 
  group_by(level) %>% 
  summarise(
    Meal_Average =  filter(., ADD_ALLOW_MEAL =="Y" & ALLOW_MEALLOW>0) %>% {ifelse(str_detect(.$CODE, "2")=="TRUE", round(mean(.$ALLOW_MEALLOW, na.rm = TRUE),3), NA_real_ )}  
  )

Я получаю ошибку:

Column `Meal_Average` must be length 1 (a summary value), not 4

Мой желаемый результат будет:

 level    Meal_Average 
1      1   50
2      2   NA
3      3   NA
4      4   NA
5      5   NA
6      6   NA
7      7   NA
8      8   NA

Любые идеи, как я могусделать это?

Спасибо !!

1 Ответ

0 голосов
/ 21 ноября 2018

Вот идея использования dplyr.Я просто использовал ваши условия, чтобы заменить значение ALLOW_MEALLOW на 0 (чтобы оно не влияло на среднее значение), то есть

library(dplyr)

df %>% 
 mutate(ALLOW_MEALLOW = replace(ALLOW_MEALLOW, ADD_ALLOW_MEAL == 'N' & ALLOW_MEALLOW < 0 | !grepl('2', CODE), 0)) %>% 
 group_by(level) %>% 
 summarise(new_mean = mean(ALLOW_MEALLOW, na.rm = TRUE))

, которое дает

# A tibble: 8 x 2
  level new_mean
  <dbl>    <dbl>
1     1       50
2     2        0
3     3        0
4     4        0
5     5        0
6     6        0
7     7        0
8     8        0

ПРИМЕЧАНИЕ: Вы можете заменить 0 на NA как обычно

...