首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R-基于另一列中的条目的列的最大标准差/方差

R-基于另一列中的条目的列的最大标准差/方差
EN

Stack Overflow用户
提问于 2016-06-16 09:06:33
回答 2查看 1.1K关注 0票数 1

我是R的初学者。我正在使用一个有多列的数据框架,我想要计算作为列2中条目的函数的列1的最高方差或标准差。例如,如果我的数据集如下所示,我想分别计算学校A、学校B和学校C的最高标准差。

代码语言:javascript
复制
School City Percent
A       X     92
B       Y     80
C       Z     95
A       X     89
B       Y     75
EN

回答 2

Stack Overflow用户

发布于 2016-06-16 11:44:16

在base R中,根据data.frame中的不同分组,可以使用函数ave()添加一个从其他列派生的数量的列。

下面是一个示例:

代码语言:javascript
复制
df1$var <- with(df1, ave(Percent, School, FUN=var))
df1$sd <- with(df1, ave(Percent, School, FUN=sd))
> df1
#  School City Percent  var       sd
#1      A    X      92  4.5 2.121320
#2      B    Y      80 12.5 3.535534
#3      C    Z      95   NA       NA
#4      A    X      89  4.5 2.121320
#5      B    Y      75 12.5 3.535534

可以使用which.max()提取具有最大值的条目

代码语言:javascript
复制
df1[which.max(df1$var),]
#  School City Percent  var       sd
#2      B    Y      80 12.5 3.535534

另一个基本R选项是使用aggregate()。这将以更紧凑的形式表示结果:

代码语言:javascript
复制
df2 <- setNames(aggregate(Percent~School, df1, var), c("School", "Percent.var"))
> df2
#  School Percent.var
#1      A         4.5
#2      B        12.5
#3      C          NA

代码语言:javascript
复制
df2 <- setNames(aggregate(Percent~School, df1, sd), c("School", "Percent.sd"))
> df2
#  School Percent.sd
#1      A   2.121320
#2      B   3.535534
#3      C         NA

或者,这两个aggregate操作组合在一起:

代码语言:javascript
复制
df2 <- setNames(do.call(data.frame,
                aggregate(Percent~School, df1, function(x) c(var(x),sd(x)))),
                c("School","Percent.var","Percent.sd"))
#  School Percent.var Percent.sd
#1      A         4.5   2.121320
#2      B        12.5   3.535534
#3      C          NA         NA

在这些情况下,也可以使用which.max()从输出中提取最大值

代码语言:javascript
复制
df2[which.max(df2$Percent.sd),]
#  School Percent.var Percent.sd
#2      B        12.5   3.535534

本例中使用的数据:

代码语言:javascript
复制
df1 <- structure(list(School = structure(c(1L, 2L, 3L, 1L, 2L), 
                 .Label = c("A", "B", "C"), class = "factor"), 
                 City = structure(c(1L, 2L, 3L, 1L, 2L), 
                 .Label = c("X", "Y", "Z"), class = "factor"), 
                 Percent = c(92L, 80L, 95L, 89L, 75L)), 
                 .Names = c("School", "City", "Percent"), 
                 class = "data.frame", row.names = c(NA, -5L))
票数 2
EN

Stack Overflow用户

发布于 2016-06-16 10:51:41

这将分别计算每个学校(A、B、C)的标准差

代码语言:javascript
复制
df<-data.frame(school=c("A","B","C","A","B"),percent=c(92,80,95,89,75))

library(dplyr)
result<-split(df,df$school)%>%lapply(.,function(x)sd(x$percent))%>%unlist(.)%>%as.data.frame(.)
res<-cbind(row.names(result),result)
colnames(res)<-c("school","std_dev")
res


#output
> res
  school  std_dev
A      A 2.121320
B      B 3.535534
C      C       NA
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37848259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档