R中频率表出错

时间:2016-02-19 02:10:49

标签: r frequency

我有一个数据框如下:

   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

这是获取每个表的消息总数和每个表的条件频率的正确方法吗?

4 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分:0)

如果我们调用您的数据集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)

答案 3 :(得分:0)

您始终可以使用包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) 解决此问题。

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

如果您想要每个条件的消息总数,请使用:

SELECT
    t.uid,
    GROUP_CONCAT(tt.tag) AS tags
FROM
    tbl_forums t,
    tbl_forum_tags tt
WHERE
    FIND_IN_SET(tt.id, t.tags) > 0
GROUP BY
    t.uid

希望有所帮助。