Создание нового фрейма данных в R из существующего, неадекватного фрейма данных - PullRequest
5 голосов
/ 05 марта 2011

Это действительно простая проблема, но я не могу понять, как ее написать.Я не могу двигаться вперед, пока не пойму это.Я действительно новичок в 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 ]

10 голосов
/ 05 марта 2011

Библиотека 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)
9 голосов
/ 05 марта 2011

Вам нужно 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))
9 голосов
/ 05 марта 2011
aggregate(x[,"c",drop=FALSE], by=x[,"a",drop=FALSE], sum)

drop=FALSE должен гарантировать, что объект, созданный путем подстановки x, является data.frame.Если вы пропустите drop=FALSE, измерения data.frame будут удалены (поскольку вы обращаетесь только к одному столбцу data.frame), а результатом поднабора будет вектор.См. ?"[" и ?drop для получения более подробной информации.

ОБНОВЛЕНИЕ: Я согласен с Гэвином, что интерфейс формулы чище:

aggregate(c ~ a, data=x, sum)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...