如何仅为特定行获取列的平均值?

时间:2012-09-12 18:37:07

标签: r dataframe mean

我需要获取特定行的一列(此处为:得分)的平均值(此处为:年)。具体来说,我想知道三个时期的平均分数:

  • 第1期:年< = 1983
  • 期间2:年>> = 1984&年< = 1990
  • 第3期:年> = 1991

这是我的数据结构:

  country year     score        
 Algeria 1980     -1.1201501 
 Algeria 1981     -1.0526943 
 Algeria 1982     -1.0561565 
 Algeria 1983     -1.1274560 
 Algeria 1984     -1.1353926 
 Algeria 1985     -1.1734330 
 Algeria 1986     -1.1327666 
 Algeria 1987     -1.1263586 
 Algeria 1988     -0.8529455 
 Algeria 1989     -0.2930265 
 Algeria 1990     -0.1564207 
 Algeria 1991     -0.1526328 
 Algeria 1992     -0.9757842 
 Algeria 1993     -0.9714060 
 Algeria 1994     -1.1422258 
 Algeria 1995     -0.3675797 
 ...

计算出的平均值应添加到附加栏中的df(“平均值”),即第2期年份的相同平均值,等于第2期等等。

这应该是这样的:

country year     score         mean   
 Algeria 1980     -1.1201501     -1.089
 Algeria 1981     -1.0526943     -1.089
 Algeria 1982     -1.0561565     -1.089
 Algeria 1983     -1.1274560     -1.089
 Algeria 1984     -1.1353926     -0.839
 Algeria 1985     -1.1734330     -0.839
 Algeria 1986     -1.1327666     -0.839
 Algeria 1987     -1.1263586     -0.839
 Algeria 1988     -0.8529455     -0.839
 Algeria 1989     -0.2930265     -0.839
 Algeria 1990     -0.1564207     -0.839
 ...

我试过的每一条可能的路径都很容易超级复杂 - 我必须计算90多个国家不同时期的平均得分...

非常感谢你的帮助!

3 个答案:

答案 0 :(得分:14)

datfrm$mean <-
  with (datfrm, ave( score, findInterval(year, c(-Inf, 1984, 1991, Inf)), FUN= mean) )

标题问题与真实问题略有不同,将通过使用逻辑索引来回答。如果只想要特定子集的平均值year >= 1984 & year <= 1990,则可以通过以下方式完成:

mn84_90 <- with(datfrm, mean(score[year >= 1984 & year <= 1990]) )

答案 1 :(得分:5)

由于findInterval需要对year进行排序(就像在您的示例中一样),因此我很想使用cut以防它被排序 [证明是错误的,谢谢@DWin]。为了完整性,data.table等价物(大数据的比例)是:

require(data.table)
DT = as.data.table(DF)   # or just start with a data.table in the first place

DT[, mean:=mean(score), by=cut(year,c(-Inf,1984,1991,Inf))]
使用DW时,

findInterval可能更快:

DT[, mean:=mean(score), by=findInterval(year,c(-Inf,1984,1991,Inf))]

答案 2 :(得分:0)

如果按年份对行进行排序,那么我认为最简单的方法是:

m80_83 <- mean(dataframe[1:4,3]) #Finds the mean of the values of column 3 for rows 1 through 4
m84_90 <- mean(dataframe[5:10,3])
#etc.

如果未按年份对行进行排序,我将使用tapply这样。

list.of.means <- c(tapply(dataframe$score, cut(dataframe$year, c(0,1983.5, 1990.5, 3000)), mean)

在这里,tapply具有三个参数:

首先,要处理的数据(在本例中为datafram $ score)。

第二个,将数据分成几组的函数。在这种情况下,它将根据dataframe $ year值将数据分为三组。第1组将包括dataframe $ year值从0到1983.5的所有行,第2组将包括dataframe $ year值从1983.5到1990.5的所有行,第3组将包括dataframe $ year的值从1983.5到3000的所有行。 / p>

第三,应用于每个组的功能。此功能将应用于您选择作为第一个参数的数据。

因此,list.of.means应该是您要查找的3个值的列表。