我有以下数据。
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)
答案 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]