这是一个非常简单的问题,但我无法弄清楚如何编写脚本。在我搞清楚之前,我不能前进。我是R的新手并且使用代码,我正在阅读几本介绍性手册,但还没有找到任何针对这个特定问题的内容。
一般来说,这是问题所在。假设我有一个名为x
的数据框,如下所示:
a <- c(1995,1995,1995,1996,1997,1997,1997,1998)
b <- c(1,2,3,1,2,3,4,1)
c <- c(5,7,8,2,4,5,7,8)
(x <- data.frame(a,b,c))
a b c
1 1995 1 5
2 1995 2 7
3 1995 3 9
4 1996 1 2
5 1997 2 4
6 1997 3 5
7 1997 4 7
8 1998 1 8
a
栏中的某些年份有多个条目(即1995年出现3次),而实际上我每年只想要一个条目。如果我尝试在列a
上绘制列c
,我会在每个日期得到多个积分,但这没有用。我不关心列b,但是我希望每年对列c
的条目求和,这样我最终会得到一个每年有一个条目的数据框。鉴于上述数据,结果数据框将如下所示:
a c
1 1995 21
2 1996 2
3 1997 16
4 1998 8
有什么想法吗?
答案 0 :(得分:10)
plyr
库对于诸如此类的聚合任务非常有用。 plyr
也适用于ggplot2
图片。在我看来,plyr的好处是你明确定义了输入和输出的结构。在这里,我们传入data.frame
对象,并且在处理后也需要data.frame
,因此我们将使用ddply
。第一个字母对应输入对象,第二个字母对应输出。因此,如果我们想要从list
对象转到data.frame
,我们会使用ldply
等。
library(ggplot2) #Loads plyr
text <- "a b c
1995 1 5
1995 2 7
1995 3 9
1996 1 2
1997 2 4
1997 3 5
1997 4 7
1998 1 8
"
df <- read.table(textConnection(text), header = TRUE)
#Create plotData data.frame that groups by the "a" column and returns the sum of "c"
plotData <- ddply(df, "a", summarise, totalc = sum(c))
#plotting with ggplot
qplot(factor(a), totalc, data = plotData)
答案 1 :(得分:9)
aggregate(x[,"c",drop=FALSE], by=x[,"a",drop=FALSE], sum)
drop=FALSE
是为了确保通过子集x
创建的对象是data.frame。如果省略drop=FALSE
,data.frame的维度将被删除(因为您只访问data.frame的一列),并且子集化的结果将是一个向量。有关详细信息,请参阅?"["
和?drop
。
更新:我同意Gavin公式界面更清晰:
aggregate(c ~ a, data=x, sum)
答案 2 :(得分:9)
您需要tapply
。例如,
## Your data
c1 = c(1995, 1995, 1995, 1996, 1997, 1997, 1997, 1998)
c2 = c(5, 7, 9, 2, 4, 5, 7, 8)
x = data.frame(c1, c2)
y = tapply(x$c2, x$c1, sum)
names(y) ## For the years
as.vector(y)
## So to get a data frame
data.frame(a=names(y), c=as.vector(y))