年
1999 1999 1999 2003 2003 2005 2005 2005 2005 2007 2009 2009
A1
15 7 24 6 65 5 89 56 21 15 19 7 23
上表显示了一个数据框。我想要一个矢量,让我们说" median1"其中a1中这些值的中值对应于每年。而且我知道,使用for循环很容易,但我正在尝试找到一个矢量化的'基于解决方案。
答案 0 :(得分:1)
data.table
被称为data.frame
,请使用DF
个包
library(data.table)
DT = data.table(DF)
DT[,median(a1),by='year']
答案 1 :(得分:1)
使用ave
这是一个R基函数。将ave
与transform
结合起来,您将获得非常好的输出。考虑dat
是您的data.frame
> transform(dat, Median= ave(a1, year, FUN=median))
year a1 Median
1 1999 20 15.0
2 1999 15 15.0
3 1999 11 15.0
4 2003 11 7.0
5 2003 3 7.0
6 2007 89 40.5
7 2007 25 40.5
8 2007 56 40.5
9 2007 12 40.5
如果您每年只想要一个由中位数组成的向量,您可以这样做:
> with(dat, ave(a1, year, FUN=median))
[1] 15.0 15.0 15.0 7.0 7.0 40.5 40.5 40.5 40.5
答案 2 :(得分:1)
在基础R中,您可以这样做:
foo <- data.frame(
year=c(1999,1999,1999,2003,2003,2005,2005,2005,2005,2007,2009,2009,2009),
A1=c(15,7,24,6,65,5,89,56,21,15,19,7,23))
by(foo$A1,foo$year,median)
严格来说,结果不是vector
,但你可以解决这个问题:
as.vector(by(foo$A1,foo$year,median))
当你想通过小组进行操作时, by()
总是有用。
答案 3 :(得分:0)
我不清楚,但似乎你想要每年的中位数?如果是的话......
## set up the data
> year <- c(1999,1999,1999,2003,2003,2005,2005,2005,2005,2007,2009,2009,2009)
> A1 <- c(15, 7, 24, 6, 65, 5, 89, 56, 21, 15, 19, 7, 23)
> dd <- data.frame(year, A1)
## solution
> xx <- c(do.call(cbind, lapply(split(dd, dd$year), function(x) median(x$A1))))
> names(xx) <- unique(dd$year)
> xx
1999 2003 2005 2007 2009
15.0 35.5 38.5 15.0 19.0