и преобразование из длинного в широкое использование

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

     Id        Description          Value
     10        Cat                  19
     10        Cat                  20
     10        Cat                  5
     10        Cat                  13
     11        Cat                  17
     11        Cat                  23
     11        Cat                  7
     11        Cat                  14  
     10        Dog                  19
     10        Dog                  20
     10        Dog                  5
     10        Dog                  13
     11        Dog                  17
     11        Dog                  23
     11        Dog                  7
     11        Dog                  14    

То, что я пытаюсь сделать, это захватить среднее значение столбца Значение с помощью идентификатора, Описание. Окончательный набор данных будет выглядеть следующим образом.

     Id       Cat         Dog 
     10       14.25       28.5
     11       15.25       15.25

Я могу сделать это очень грубо, не очень эффективно, как это

tempdf1 <- df %>%
  filter(str_detect(Description, "Cat")) %>%
   group_by(Id, Description) %>%
  summarize(Mean_Value = mean(Value) , na.rm = TRUE))

Это не очень удобно. Любые советы о том, как добиться ожидаемых результатов более эффективно, высоко ценится.

 MKR22 дек. 2017 г., 21:58
data.table поможет вам.

Ответы на вопрос(4)

Вы можете сделатьsummarise с помощьюdplyr и преобразование из длинного в широкое использованиеtidyr::spread:

library(dplyr)
library(tidyr)

df %>%
    group_by(Id, Description) %>%
    summarise(Mean = mean(Value)) %>% 
    spread(Description, Mean)

     Id   Cat   Dog
* <int> <dbl> <dbl>
1    10 14.25 14.25
2    11 15.25 15.25

используяdata.table и получить желаемый формат таблицы с помощьюdcast():

library(data.table)
foo <- setDT(d)[, mean(Value), .(Id, Description)]
#    Id Description    V1
# 1: 10         Cat 14.25
# 2: 11         Cat 15.25
# 3: 10         Dog 14.25
# 4: 11         Dog 15.25
dcast(foo, Id ~ Description, value.var = "V1")
#    Id   Cat   Dog
# 1: 10 14.25 14.25
# 2: 11 15.25 15.25
 bison217822 дек. 2017 г., 22:00
спасибо Po, я против использования библиотеки data.table. Эта библиотека ничего не дала мне от головной боли. Иногда это работает, большую часть времени это происходит сбой системы.
 Onyambu22 дек. 2017 г., 22:01
Вы можете использовать dcast напрямую:dcast(dat,Id~Description,mean)
Решение Вопроса

использованиеdcast или дажеacast изreshape2() пакет

dcast(dat,Id~Description,mean)
   Id   Cat   Dog
 1 10 14.25 14.25
 2 11 15.25 15.25

Base R может быть немного дольше:

 reshape(aggregate(.~Id+Description,dat,mean),direction = "wide",v.names  = "Value",idvar = "Id",timevar = "Description")
  Id Value.Cat Value.Dog
1 10     14.25     14.25
2 11     15.25     15.25

Я бы сделал это сtapply:

with( dat, tapply(Value, list(Id,Description), mean))
     Cat   Dog
10 14.25 14.25
11 15.25 15.25

Возвращает ли матричный объект, поэтому не пытайтесь получить доступ с помощью "$15$quot;.

Ваш ответ на вопрос