【问题标题】:Merge data frames for Cohen's kappa合并 Cohen 的 kappa 的数据框
【发布时间】:2013-05-21 14:43:39
【问题描述】:

我正在尝试使用 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

?

【问题讨论】:

    标签: r merge dataframe


    【解决方案1】:

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

    # 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))
    

    【讨论】:

    • 如果喜欢,可以勾选箭头接受答案。
    • 感谢您提供两种解决方法。现在,我将尝试理解第一个版本...... :) 我不明白的是聚合函数的行。 rater_2~id+rater_1 是什么意思?我试图查找它,但找不到答案。
    • 查看?aggregate 中的示例,特别是## Formulas... 下的示例。本质上,这意味着,对于not.same.ratingidrater_1 的每个组合,找到maxrater_2 值。
    • 好的,现在我明白了。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 2020-03-17
    • 1970-01-01
    相关资源
    最近更新 更多