Добавить SD для каждой группы в переменную - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть данные ниже.

Name<-c('A','A','B','C','B','C','D','B','C','A','D','C')
Rate<-c(12,13,4,8,7,3,6,8,5,4,7,5)
df<-cbind.data.frame(Name,Rate) 


Name    Rate
A        12
A        13
B         4
C         8
B         7
C         3
D         6
B         8
C         5
A         4
D         7
C         5

Я хочу рассчитать SD курса для каждой группы и добавить его обратно в курс.Таким образом, столбец Rate будет Rate + SD (Rate) для каждой категории имени.Может ли кто-нибудь помочь мне с этим, пожалуйста?

Так что мой датафрейм будет

Name        Rate
A        12 + SD(GroupA)
A        13 + SD(GroupA)
B         4 + SD(GroupB)
C         8 + SD(GroupC)
B         7 + SD(GroupB)
C         3 + SD(GroupC)
D         6 + SD(GroupD)
B         8 + SD(GroupB)
C         5 + SD(GroupC)
A         4 + SD(GroupA)
D         7 + SD(GroupD)
C         5 + SD(GroupC)

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Используя dplyr мы можем сделать

library(dplyr)

df %>% 
   group_by(Name) %>% 
   mutate(Rate = Rate + sd(Rate))


#   Name   Rate
#   <fct> <dbl>
# 1  A     16.9 
# 2  A     17.9 
# 3  B      6.08
# 4  C     10.1 
# 5  B      9.08
# 6  C      5.06
# 7  D      6.71
# 8  B     10.1 
# 9  C      7.06
#10  A      8.93
#11  D      7.71
#12  C      7.06

И версия data.table будет

library(data.table)
setDT(df)[, Rate := Rate + sd(Rate), by = Name]
0 голосов
/ 04 декабря 2018

Вот простое решение Base R с использованием ?ave().

df$Rate <- ave(df$Rate, df$Name, FUN = function(x) x + sd(x))

   Name      Rate
1     A 16.932883
2     A 17.932883
3     B  6.081666
4     C 10.061553
5     B  9.081666
6     C  5.061553
7     D  6.707107
8     B 10.081666
9     C  7.061553
10    A  8.932883
11    D  7.707107
12    C  7.061553

Благодаря Ронаку, вот лучшая версия -

df$Rate <- with(df, Rate + ave(Rate, Name, FUN = sd))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...