【问题标题】:How can I split my data frame into multiple tables and put them into e list?如何将我的数据框拆分为多个表并将它们放入 e 列表中?
【发布时间】:2015-08-31 14:26:45
【问题描述】:

我有一个数据框,其中包含来自两个评估者的数据来测试 4 种不同测试的可靠性:

test1_rater1<-c(1,4,3,2,3,4,1,2,2,3)
test2_rater1<-c(1,3,3,3,2,3,1,1,2,1)
test3_rater1<-c(1,4,3,4,4,2,3,1,3,4)
test4_rater1<-c(1,3,4,2,3,2,1,2,3,2)
test1_rater2<-c(1,3,3,4,3,4,3,2,1,3)
test2_rater2<-c(1,3,1,3,1,3,3,1,1,1)
test3_rater2<-c(1,3,3,2,4,2,3,4,3,4)
test4_rater2<-c(2,3,4,4,3,2,3,2,3,2)
mydata<-data.frame(test1_rater1,test2_rater1,test3_rater1,test4_rater1,test1_rater2,test2_rater2,test3_rater2,test4_rater2)

# For the kappa statistic, I used:

cohen.kappa(cbind(test1_rater1,test1_rater2))
cohen.kappa(cbind(test2_rater1,test2_rater2))
cohen.kappa(cbind(test3_rater1,test3_rater2))
cohen.kappa(cbind(test4_rater1,test4_rater2))

在我的数据框中是来自 80 多个不同测试的数据,这个解决方案非常复杂......我想了一个列表,然后使用 lapply 函数,但我没有工作。有没有更短的方法来做到这一点?

谢谢,纳特

【问题讨论】:

  • 这是什么语言?
  • 为什么 lapply 不起作用?请显示您的代码和预期的输出。
  • 也许是一个起点here
  • 您可以split 列名,然后使用lapplylapply(split(names(mydata), sub('_.*', '', names(mydata))), function(x) cohen.kappa(mydata[x]) )

标签: r


【解决方案1】:

第一步是tidy 您的数据:不要为每对测试和评估者设置一个列,而是为test 设置一个列,然后为rater1rater2 设置一个列。您可以使用 dplyr 和 tidyr 包进行这种重组:

library(dplyr)
library(tidyr)
rearranged_data <- mydata %>%
  mutate(row = row_number()) %>%
  gather(column, value, -row) %>%
  separate(column, c("test", "rater")) %>%
  spread(rater, value)

head(rearranged_data)
#>   row  test rater1 rater2
#> 1   1 test1      1      1
#> 2   1 test2      1      1
#> 3   1 test3      1      1
#> 4   1 test4      1      2
#> 5   2 test1      4      3
#> 6   2 test2      3      3

现在您可以在每个测试中执行 Cohen-kappa 计算。这将需要一个函数将kappa 对象转换为数据框。你可以使用这个功能:

library(broom)
tidy_kappa <- function(x) {
  broom::fix_data_frame(x$confid, newcol = "type")
}

如果您使用devtools::install_github("dgrtwo/broom") 安装我的broom package 的最新版本,您可以只使用tidy 方法,因为我刚刚在包中添加了一个这样的方法。

现在您可以使用 dplyr 的 group_bydo 执行 cohen.kappa 测试:

library(psych)
results <- rearranged_data %>%
  group_by(test) %>%
  do(tidy_kappa(cohen.kappa(cbind(.$rater1, .$rater2))))
results
#> Source: local data frame [8 x 5]
#> Groups: test
#> 
#>    test             type       lower  estimate     upper
#> 1 test1 unweighted kappa  0.08574000 0.4594595 0.8331789
#> 2 test1   weighted kappa  0.07284356 0.5238095 0.9747755
#> 3 test2 unweighted kappa -0.10654813 0.3333333 0.7732148
#> 4 test2   weighted kappa -0.09877879 0.4444444 0.9876677
#> 5 test3 unweighted kappa  0.19876127 0.5833333 0.9679054
#> 6 test3   weighted kappa -0.39241493 0.3577982 1.1080113
#> 7 test4 unweighted kappa  0.21116862 0.5714286 0.9316885
#> 8 test4   weighted kappa -0.02324226 0.4444444 0.9121311

无论您有多少个测试,这种方法都有效,每个测试产生两行(一个带有未加权的 kappa,一个带有加权:就像 cohen.kappa 函数的输出一样)。请注意,此输出格式对于绘制图表或进一步分析结果很有用:

library(ggplot2)
ggplot(results, aes(estimate, test)) +
  geom_point() +
  geom_errorbarh(aes(xmin = lower, xmax = upper)) +
  facet_wrap(~ type) +
  geom_vline(xintercept = 0, color = "red", linetype = 2)

【讨论】:

  • 谢谢大卫。我实际上不知道所有代码的含义,但终于成功了!
猜你喜欢
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 2020-09-23
  • 2015-08-11
  • 2016-01-05
  • 1970-01-01
相关资源
最近更新 更多