2016-06-16 8 views
0

私はRの初心者です。複数の列を持つデータフレームを使用しています。ここで、列1の最高分散または標準偏差を計算したいたとえば、2番目の項目の関数として。たとえば、私のデータセットが以下のように見える場合、私は学校A、学校B、学校Cの最高標準偏差を別々に計算します。R-最高標準偏差/別の列の項目に基づく列の差異

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

はどのように我々は、1つまたは2つのインスタンスを持つ学校の分散を計算することになっていますか?さらに、そのデータセットからの「列1」の分散を求めるのはナンセンスです。 –

+0

実際のデータセットは膨大です。これは私の質問を説明するための単なる例でした。 – beginner1

+0

これらの回答の1つが問題の解決に役立った場合は、回答の横にある緑色のチェックボックスをオンにして問題を解決してください。 – Rilcon42

答えて

1

これは、各学校の標準偏差(A、B、Cに)基地Rで別々

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

を計算する、機能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 

エントリはwhich.max()を使用して抽出することができる。

df1[which.max(df1$var),] 
# School City Percent var  sd 
#2  B Y  80 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 

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操作:これらの場合において

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()を使用して出力から抽出する:

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