2013-09-03 2 views
3

У меня есть две частотные таблицы, созданные с помощью R «ы table() функции:частоты с использованием R

freq1 <- table(unlist(strsplit(topic_list1, split=";"))) 
freq2 <- table(unlist(strsplit(topic_list2, split=";"))) 

topic_list1 и topic_list2 являются строками, которые содержат текстовые представления тем, разделенных ;.

Я хочу, чтобы сравнить две частоты, если возможно, графически.

Итак, если в двух списках содержится одна и та же тема с разными частотами, я бы хотел ее увидеть. То же самое касается тем, присутствующих в одной частотной таблице, но не в другой.

+1

Чтобы помочь вам получить ответ на ваш вопрос на SO: обеспечить набор данных небольшой пример, который может быть вставлен непосредственно в R (например, извлечь небольшое количество данных в другой переменной или переменных, а также использовать 'dput '). –

+1

Если мы интерпретируем это как вопрос визуализации данных, он допустит ответы общего интереса (помимо просто программирования «R») и тем самым станет подходящим для этого сайта. – whuber

+0

Спасибо, я отметил этот вопрос как не по теме. –

ответ

2

Там, наверное, более элегантный способ сделать это, но это должно работать:

# here I'm generating some example data 
set.seed(5) 
topic_list1 <- paste(sample(letters, 20, replace=T), sep=";") 
topic_list2 <- paste(sample(letters, 15, replace=T), sep=";") 

# I don't make the tables right away 
tl1  <- unlist(strsplit(topic_list1, split=";")) 
tl2  <- unlist(strsplit(topic_list2, split=";")) 
big_list <- unique(c(tl1, tl2)) 

# this computes your frequencies 
lbl   <- length(big_list) 
tMat1  <- matrix(rep(tl1, lbl), byrow=T, nrow=lbl) 
tMat2  <- matrix(rep(tl2, lbl), byrow=T, nrow=lbl) 
tMat1  <- cbind(big_list, tMat1) 
tMat2  <- cbind(big_list, tMat2) 
counts1  <- apply(tMat1, 1, function(x){sum(x[1]==x[2:length(x)])}) 
counts2  <- apply(tMat2, 1, function(x){sum(x[1]==x[2:length(x)])}) 
total_freqs <- rbind(counts1, counts2, counts1-counts2) 

# this makes it nice looking & user friendly 
colnames(total_freqs) <- big_list 
rownames(total_freqs) <- c("topics1", "topics2", "difference") 
total_freqs   <- total_freqs[ ,order(total_freqs[3,])] 
total_freqs 
      d l a z b f s y m r x h n i g k c v o 
topics1  0 0 0 0 0 2 1 1 1 1 2 2 1 1 1 1 2 2 2 
topics2  2 2 2 1 1 2 1 1 1 0 1 1 0 0 0 0 0 0 0 
difference -2 -2 -2 -1 -1 0 0 0 0 1 1 1 1 1 1 1 2 2 2 

Оттуда вы могли бы просто использовать прямые номера или визуализировать их, как вы хотите (например, dotplots и т.д.) , Вот простой dotplot:

windows() 
    dotchart(t(total_freqs)[,3], main="Frequencies of topics1 - topics2") 
    abline(v=0) 

enter image description here

+0

Это может быть отличный ответ SO, но на этом сайте ему по крайней мере нужно некоторое объяснение того, что он делает. Вы, кажется, уклоняетесь от ключевой части вопроса: как можно визуализировать результаты? – whuber

+0

Полагаю, я предполагаю, что это закончится мигрированием. Разница в подсчетах - «способ сравнить две частоты». Что касается того, как сравнить их графически, это кажется очевидным на данный момент, но я могу добавить сюжет. – gung

+0

Я думал, что вопрос о графическом дисплее может быть открыт для некоторых творческих ответов :-). – whuber

0

Вы можете просто barplot их (с рядом = T аргумента), что даст вам возможность визуально сравнить отсчеты на уровне ... ниже является пример:

counts <- table(mtcars$vs, mtcars$gear) 
barplot(counts, col=c("darkblue","red"), legend=rownames(counts), beside=T)