2016-02-19 50 views
0

У меня есть dataframe, который является следующим:Ошибка в таблице частоты в R

Name Condition NumMessage 
Table 1  NULL   80 
Table 1  Fair   20 
Table 1  Good   60 
Table 1  Ideal   50 
Table 1  Great   80 
Table 2  NULL   80 
Table 2  Fair   100 
Table 2  Good   90 
Table 2  Ideal   50 
Table 2  Great   40 

и так далее. Я попытался создать частотную таблицу для количества сообщений для каждой таблицы.

data = as.data.frame(prop.table(table(dataframe$Name))) 
colnames(data) = c('Table Name', 'Frequency') 
data 

но это возвращает такой же частоты для всех таблиц. Например, в таблице 1 содержится 290 сообщений, где Таблица 2 содержит 360 сообщений. Но приведенный выше код дает такую ​​же частоту для обеих таблиц.

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

prop.table(table(dataframe$Condition, dataframe$Name)) 

NULL | some value 
Fair | some value 
Good | some value 
Ideal | some value 
Great | some value 

это правильный путь, чтобы получить частоту от общего числа сообщений для каждой таблицы и частоты условий для каждой таблицы?

+1

'prop.table (xtabs (NumMessage ~ Name + Condition, data = df), 1)' или что-то в этом роде. – thelatemail

+0

@thelatemail yup, именно то, что я искал, если вы опубликуете его как ответ, я могу выбрать его как ответ –

ответ

3

xtabs является база R способом получить суммированные таблицы сопряженности.

prop.table(xtabs(NumMessage ~ ., data=df), 1) 
#  Condition 
#Name   Fair  Good  Great  Ideal  NULL 
# Table1 0.06896552 0.20689655 0.27586207 0.17241379 0.27586207 
# Table2 0.27777778 0.25000000 0.11111111 0.13888889 0.22222222 
+0

это возможно для вывода для общей, а не для каждой отдельной таблицы? (в дополнение к выше, что также необходимо) –

+0

@RainMan - я не уверен, что вы имеете в виду? Соотношение общего количества? если это так, просто удалите ', 1' и используйте' prop.table (...) ' – thelatemail

+0

, например, суммируйте справедливые, хорошие, большие, ieadl и нулевые пропорции для всех таблиц. Причина в том, что я хочу сделать гистограмму с условиями как ось x и пропорция как y –

0

Если мы будем называть ваш dataset df, то, возможно, это то, что вы ищете?

df1 = subset(df, Name=='Table1') 
df2 = subset(df, Name=='Table2') 
prop.table(df1[,3]) 
prop.table(df2[,3]) 

aggregate(df1$NumMessage, list(df1$Name), sum) 
aggregate(df1$NumMessage, list(df2$Name), sum) 
+0

есть 100+ таблиц, я не могу создать df для каждого –

3

Мы могли бы попробовать с acast

library(reshape2) 
prop.table(acast(df1, Name~Condition, value.var='NumMessage', sum),1) 
#     Fair  Good  Great  Ideal  NULL 
#Table 1 0.06896552 0.2068966 0.2758621 0.1724138 0.2758621 
#Table 2 0.27777778 0.2500000 0.1111111 0.1388889 0.2222222 
+1

спасибо, этот тоже работает –

0

Вы всегда можете решить эту проблему с помощью пакета sqldf.

library(sqldf) 
Name<-c('Table1','Table1','Table1','Table1','Table1','Table2','Table2','Table2','Table2','Table2') 
Cond<-c(NA,'Fair','Good','Ideal','Great',NA,'Fair','Good','Ideal','Great') 
Msg<-c(80,20,60,50,80,80,100,90,50,40) 
df<-data.frame(Name,Cond,Msg) 

Ваш dataframe:

Name Cond Msg 
1 Table1 <NA> 80 
2 Table1 Fair 20 
3 Table1 Good 60 
4 Table1 Ideal 50 
5 Table1 Great 80 
6 Table2 <NA> 80 
7 Table2 Fair 100 
8 Table2 Good 90 
9 Table2 Ideal 50 
10 Table2 Great 40 

Теперь просто использовать это утверждение для суммы сообщений для каждой таблицы:

sqldf("select Name, sum(Msg) from df group by Name ") 

Name sum(Msg) 
1 Table1  290 
2 Table2  360 

Если вы хотите сумму сообщений для каждого условия, то использовать:

sqldf("select Cond, sum(Msg) from df group by Cond ") 
Cond sum(Msg) 
1 <NA>  160 
2 Fair  120 
3 Good  150 
4 Great  120 
5 Ideal  100 

Надеюсь, это поможет.

Смежные вопросы