从现有的不充分的数据框中在R中创建新的数据帧

时间:2011-03-05 17:46:14

标签: r dataframe

这是一个非常简单的问题,但我无法弄清楚如何编写脚本。在我搞清楚之前,我不能前进。我是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

有什么想法吗?

3 个答案:

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