我有以下数据结构:R:如何创建中位数和协议功能的多组
Player Team Round Question Answer
1: 2 1 1 1 1
2: 5 1 1 1 1
3: 8 1 1 1 1
4: 9 1 1 1 1
5: 10 1 1 1 1
6: 2 1 1 2 4
7: 5 1 1 2 5
8: 8 1 1 2 5
9: 9 1 1 2 5
10: 10 1 1 2 5
11: 2 1 1 4 4
12: 5 1 1 4 3
13: 8 1 1 4 4
14: 9 1 1 4 2
15: 10 1 1 4 4
16: ...
因此,有几个队几名球员,回答几个问题。总是有两轮比赛。
我试图通过对团队和问题进行分组,从数据中计算出介质和协议系数(请参阅agrmt package)。
结果应该是这样的:
Team Question Median_R1 Agrmt_R1 Median_R2 Agrmt_R2
1: 1 1 1 1 1 1
2: 1 2 2 0.83 1 1
3: ...
4: 5 10 4 1 4 1
是否有人知道这是可能的吗?我找不到解决方案。我可以独立解决中位数和协议系数,但不能合并?
每一个提示是值得欢迎的。非常感谢你。
UPDATE:
该协议函数返回之间-1和1的值表示一个系数。
- 1表示完全一致(例如,如果每个玩家回答5)。
- 0会,如果每个球员有不同的答案。
- -1是,如果存在分歧(有些玩家说1回答和其他人说5)
相比位数,协议功能发生频次向量的向量。
例如,我们有以下的答案
Player Team Round Question Answer
6: 2 1 1 2 4
7: 5 1 1 2 5
8: 8 1 1 2 5
9: 9 1 1 2 5
10: 10 1 1 2 5
功能输入应该是这样的:
平均输入:4,5,5,5,5
- >结果:5
协议输入:0,0,0,1,4
- >结果: 0.9
更新2:解决
的计算协议可以用下面的代码完成:
agreement(table(factor(x, levels=1:5)))
最后是基于@sandipan的实现。我不得不添加另一个排序步骤,以便合并正确的数据。框架:
library(agrmt)
df1 <- unique(df[c('Party', 'Question')])
for (df.R in split(df, df$Round)) {
round <- unique(df.R$Round)
# get the data.frame of the current Round.
df2 <- as.data.frame(as.list(aggregate(Answer ~ Party + Question + Round,
df.R, FUN = function(x) c(Median = median(x), Agrmt = agreement(table(factor(x, levels=1:5)))))))
# sort it and take only the columns of median and agreement
df3 <- df2[with(df2, order(Party, Question)),][4:5]
names(df3) <- c(paste('Median_R', round, sep=''), paste('Agrmt_R', round, sep=''))
df1 <- cbind.data.frame(df1, df3)
}
df1
谢谢大家的帮助。
不要求我们通读'agrmt'包Vignette,只是告诉我们你想用什么函数来计算协议。 – eipi10