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

R-基于另一列中条目的一列的最高标准偏差/方差,r,R,我是R方面的初学者。我正在使用一个有多列的数据帧,其中我想计算第1列的最大方差或标准偏差,作为第2列中条目的函数。 例如,如果我的数据集如下所示,我想分别计算A学校、B学校和C学校的最高标准偏差 School City Percent A X 92 B Y 80 C Z 95 A X 89 B Y 75 这将分别计算每个学校(A、B、C)的标准偏差 df<-data.frame(schoo

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

School City Percent
A       X     92
B       Y     80
C       Z     95
A       X     89
B       Y     75

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

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
df%unlist(.)%%>%as.data.frame(.)

res在base R中,函数
ave()
可用于添加一列,该列的数量根据data.frame中的不同组从其他列派生

以下是一个例子:

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

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

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
在这些情况下,也可以使用
which.max()
从输出中提取最大值:

本例中使用的数据:

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))

df1对于只有一个或两个实例的学校,我们应该如何计算方差?此外,要求从数据集中获得“第1列”的方差完全是胡说八道。实际的数据集是巨大的。这只是一个例子来解释我的问题。如果其中一个答案帮助你解决了问题,请选中答案旁边的绿色复选框,将其选为正确答案。
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
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
df2[which.max(df2$Percent.sd),]
#  School Percent.var Percent.sd
#2      B        12.5   3.535534
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))