将每个组的SD添加到变量

时间:2018-12-04 02:06:03

标签: r

我有以下数据。

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,并将其加回到费率中。因此,每个“名称”类别的“比率”列将为“比率+ SD(比率)”。有人可以帮我吗?

所以我的数据框应该是

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 :(得分:2)

这是使用?ave()的简单基础R解决方案。

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

感谢Ronak,这是一个更好的版本-

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

答案 1 :(得分:0)

使用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]