Barplot в R, агрегация выборочных данных - PullRequest
1 голос
/ 08 марта 2010

Я хочу составить столбчатую диаграмму в стеке или, по крайней мере, два столбца (гистограммы) из приведенных ниже данных Но я не могу понять, как. Сюжет (онлайн) не является решением, я ищу. Пожалуйста, смотрите ниже.

          online              offline
1         sehrwichtig             wichtig
2             wichtig           unwichtig
3         sehrwichtig           unwichtig
4         sehrwichtig         sehrwichtig
5         sehrwichtig         sehrwichtig
6         sehrwichtig           unwichtig
7         sehrwichtig           unwichtig
8             wichtig             wichtig
9             wichtig           unwichtig
10        sehrwichtig         sehrwichtig
11        sehrwichtig             wichtig
12        sehrwichtig           unwichtig
13            wichtig         sehrwichtig
14        sehrwichtig             wichtig

Я знаю, что мне нужен шаг, где данные агрегируются в:

                   online        offline 
   sehrwichtig           6         7 
   unwichtig             0         1 
   wichtig               3         5 

Но как?

Ответы [ 5 ]

3 голосов
/ 10 марта 2010

С ggplot2 вам не нужно предварительно агрегировать данные:

library(ggplot2)
qplot(online, data = df, fill = offline)
qplot(offline, data = df, fill = online)
3 голосов
/ 08 марта 2010

Эта агрегация - это простой вызов table внутри apply:

R> foo <- data.frame(online=sample(c("S","W","U"),10,TRUE), 
                     offline=sample(c("S","W","U"),10,TRUE))
R> apply(foo,2,table)
  online offline
S      3       1
U      4       5
W      3       4

которые вы можете кормить barplot.

2 голосов
/ 08 марта 2010
#generate data
df<- read.table(textConnection('
      online              offline
 sehrwichtig             wichtig
     wichtig           unwichtig
 sehrwichtig           unwichtig
 sehrwichtig         sehrwichtig
 sehrwichtig         sehrwichtig
 sehrwichtig           unwichtig
 sehrwichtig           unwichtig
     wichtig             wichtig
     wichtig           unwichtig
 sehrwichtig         sehrwichtig
 sehrwichtig             wichtig
 sehrwichtig           unwichtig
     wichtig         sehrwichtig
 sehrwichtig             wichtig'
 ),header=T)

#factor levels should be the same
levels(df$online) <- levels(df$offline)

my_table <- t(aaply(df,2,table))

library(graphics)
barplot2(my_table,legend = rownames(my_table), ylim = c(0, 20))

alt text

1 голос
/ 08 марта 2010

Ответ Дирка - путь, но на данных ОП простое apply(foo,2,table) не сработает - вам нужно иметь дело с 0, возможно, так:

my.data <- "online              offline
1         sehrwichtig             wichtig
2             wichtig           unwichtig
3         sehrwichtig           unwichtig
4         sehrwichtig         sehrwichtig
5         sehrwichtig         sehrwichtig
6         sehrwichtig           unwichtig
7         sehrwichtig           unwichtig
8             wichtig             wichtig
9             wichtig           unwichtig
10        sehrwichtig         sehrwichtig
11        sehrwichtig             wichtig
12        sehrwichtig           unwichtig
13            wichtig         sehrwichtig
14        sehrwichtig             wichtig"

df <- read.table(textConnection(my.data))

df.labels <- unique(as.character(apply(df,2,as.character)))
tallies <- apply(df,2,function(x)table(x)[df.labels])
tallies[is.na(tallies)] <- 0
rownames(tallies) <- df.labels

Для краткости, вы можете объединить последние 3 строки:

tallies <- apply(df,2,function(x){y <- table(x)[df.labels];
                                   names(y) <- df.labels; y[is.na(y)] <- 0; y})

Вывод:

> tallies
            online offline
sehrwichtig     10       4
wichtig          4       4
unwichtig        0       6
0 голосов
/ 08 марта 2010

Я сам этого не делал, но я знаю о пакете R, который многие люди используют для того, чтобы поместить его во второй массив там. Это называется reshape:

http://www.statmethods.net/management/reshape.html

http://had.co.nz/reshape/introduction.pdf

Что касается части прорисовки, я думаю, что lattice или ggplot, вероятно, оба имеют функции для выполнения именно того, что вы хотите, но опять же я новичок в R, поэтому я не могу сказать гораздо больше ...

...