合并Cohen的kappa数据帧

时间:2013-05-21 14:43:39

标签: r merge dataframe

我正在尝试使用 R 来分析某个日期,但我对 R (还)不是很熟悉,因此我完全陷入困境。

我尝试做的是操纵我的输入数据,以便我可以用它来计算Cohen的Kappa。 现在的问题是,对于rater_1,我对某些项目有几个评级,我需要选择一个。如果rater_1在某个项目上给出与rater_2相同的费率,则应选择此评级,如果不能使用该列表的任何评级。

我试过

unique(merge(rater_1, rater_2, all.x=TRUE))

这让我很接近,但如果两个评级者之间的评分不同,那么只保留一个。

所以,我的问题是,我如何从

获得
item rating_1
1    3
2    5
3    4 

item rating_2
1    2
1    3
2    4
2    1
2    2
3    4 
3    2

item rating_1 rating_2
1    3         3
2    5         4
3    4         4

1 个答案:

答案 0 :(得分:0)

有一些奇特的方法可以做到这一点,但我认为结合一些基本技术来完成这项任务可能会有所帮助。通常,在您的问题中,您应该包含一些简单的方法来生成数据,如下所示:

# Create some sample data
set.seed(1)
id<-rep(1:50)
rater_1<-sample(1:5,50,replace=TRUE)
df1<-data.frame(id,rater_1)

id<-rep(1:50,each=2)
rater_2<-sample(1:5,100,replace=TRUE)
df2<-data.frame(id,rater_2)

现在,这是一个简单的技术。

# Merge together the data frames.
all.merged<-merge(df1,df2)
#   id rater_1 rater_2
# 1  1       2       3
# 2  1       2       5
# 3  2       2       3
# 4  2       2       2
# 5  3       3       1
# 6  3       3       1

# Find the ones that are equal.
same.rating<-all.merged[all.merged$rater_2==all.merged$rater_1,]
# Consider id 44, sometimes they match twice.
# So remove duplicates.
same.rating<-same.rating[!duplicated(same.rating),]
# Find the ones that never matched.
not.same.rating<-all.merged[!(all.merged$id %in% same.rating$id),]
# Pick one. I chose to pick the maximum.
picked.rating<-aggregate(rater_2~id+rater_1,not.same.rating,max)
# Stick the two together.
result<-rbind(same.rating,picked.rating)
result<-result[order(result$id),] # Sort

#     id rater_1 rater_2
# 27   1       2       5
# 4    2       2       2
# 33   3       3       1
# 44   4       5       3
# 281  5       2       4
# 11   6       5       5

执行此操作的一种奇特方式是这样的:

same.or.random<-function(x) {
  matched<-which.min(x$rater_1==x$rater_2)
  if(length(matched)>0) x[matched,]
  else x[sample(1:nrow(x),1),]
}
do.call(rbind,by(merge(df1,df2),id,same.or.random))