我有一个数据框如下:
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
这是获取每个表的消息总数和每个表的条件频率的正确方法吗?
答案 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
希望有所帮助。