2016-12-08 2 views
2

Я хотел бы узнать, есть ли более компактный способ выполнить следующую задачу с помощью DPLYR. Я хочу от этого:Направление результатов DPLYR на назначенные переменные

id name value average max min 
1 chris 8   
1 chris 5   
1 chris 3   
1     
1   2   
2 tom  12   
2 tom  6   
2 tom  4   
2 tom    
2     

к этому:

id name value average max min 
1 chris 8  4.5  8 2 
1 chris 5  4.5  8 2 
1 chris 3  4.5  8 2 
1     4.5  8 2 
1   2  4.5  8 2 
2 tom  12  7.3  12 4 
2 tom  6  7.3  12 4 
2 tom  4  7.3  12 4 
2 tom    7.3  12 4 
2     7.3  12 4 

Значения сгруппированы по идентификатору. Сейчас я делаю следующий ряд команд:

Шаг 1: взять среднее по идентификатору и создать новый ДФ:

library(dplyr) 
new_df <- df %>% 
    group_by(id) %>% 
    summarise_each(funs(mean(value, na.rm=TRUE))) 

Шаг 2: Удалите все переменные, кроме в среднем new_df

Step 3: Слияние new_df назад к мастеру

Есть ли способ прямого преобразования результатов из DPLYR в переменную на основе идентификатора? Спасибо.

Новый код

df <- df %>% 
    group_by(id) %>% 
    mutate_each(funs(average = mean(value, na.rm = TRUE), 
        min = min(value, na.rm = TRUE), 
        max = max(value, na.rm = TRUE))) 

Код кадра данных

id = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2) 
name = c("chris", "chris", "chris", "", "", "tom","tom","tom","tom","") 
value = c(8,5,3,"",2,12,6,4,"","") 
average = c(1:10) 
max = c("","","","","","","","","","") 
min = c("","","","","","","","","","") 
df = data.frame(id, name, value, average, max, min) 
+0

Пожалуйста, поделитесь своими данными в [воспроизводимый формат] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). Не уверен, что эти пустые значения должны представлять. Являются ли они НС? или пробел? или строку нулевой длины? – MrFlick

+1

Привет @MrFlick, я добавил код кадра данных выше. Спасибо. – DCRubyHound

ответ

3

Чтобы избежать факторной ловушки, используйте обертку data_frame для создания рамки данных.

df = data_frame(id, name, value, average, max, min) 

, так как значение столбец символов набирается из-за присутствия «», она должна быть обращена к числовым. К счастью, это также превращает ваши «» в НС. , затем (всего за один шаг) вычеркните NA из расчетов с помощью мутанта/суммируйте дружественные na.omit().

df1 <- 
    select(df, id, value) %>% 
    mutate(value = as.numeric(value)) %>% 
    na.omit %>% 
    group_by(id) %>% 
    summarise(average = mean(value), 
       max = max(value), 
       min = min(value) 
      ) %>% 
    right_join(select(df, id, name, value), .) 

> df1 
# A tibble: 10 × 6 
     id name value average max min 
    <dbl> <chr> <chr> <dbl> <dbl> <dbl> 
1  1 chris  8 4.500000  8  2 
2  1 chris  5 4.500000  8  2 
3  1 chris  3 4.500000  8  2 
4  1    4.500000  8  2 
5  1   2 4.500000  8  2 
6  2 tom 12 7.333333 12  4 
7  2 tom  6 7.333333 12  4 
8  2 tom  4 7.333333 12  4 
9  2 tom  7.333333 12  4 
10  2    7.333333 12  4 
+0

это сработало отлично, спасибо @leerssej !! :) – DCRubyHound

+0

Мое удовольствие! Весело спорить, и рад помочь! :-D –

+0

@leerseej. Быстрый вопрос для вас.В большинстве случаев этот код работает отлично, но каждый раз я получаю следующее сообщение об ошибке: Нет общих переменных. Пожалуйста, укажите параметр 'by' param. Когда я перезапускаю R и снова запускаю код, я не получаю ошибку. Любая идея, как избежать этой ошибки? – DCRubyHound

4

Наверное так:

library(dplyr) 
df <- df %>% 
    group_by(id) %>% 
    mutate(average = mean(value, na.rm = TRUE), 
     min = min(value, na.rm = TRUE), 
     max = max(value, na.rm = TRUE)) 
+0

спасибо, @Wojciech. Это получает значения в правильные столбцы, но выполняет вычисления на основе всех значений, а не идентификатора группы. – DCRubyHound

+0

Ну, копирование ваших входных данных и выполнение моего кода дает именно ваш желаемый результат –

+0

спасибо, @wojciech. Я пробовал ваш код еще пару раз, и я все равно получаю его, чтобы сообщать только средние, минимальные и максимальные значения для всех значений не для двух разных идентификаторов (1 и 2). Посредством некоторых проб и ошибок я думаю, что я понял, что было не так (по крайней мере, на моем конце), и когда я добавляю mutate_each, он разбивает вычисления по группам, но также создает много новых переменных в этом процессе. Любая идея, как получить новый код (выше) для публикации результатов в трех назначенных столбцах? Спасибо. – DCRubyHound

0

Как насчет:

library(dplyr) 
df %>% 
    group_by(id) %>% 
    mutate(average = mean(value, na.rm = TRUE), 
     min = min(value, na.rm = TRUE), 
     max = max(value, na.rm = TRUE)) %>% 
    left_join(df) 
Смежные вопросы