使用Tidyverse计数REDCap数据中多列中特定字符串的频率

问题描述

我经常从REDCap调查中获得数据,在这些数据中,答卷人被允许对调查问题进行“检查”> 1个回答。每个潜在的响应都位于其自己的列中。我想总结一下检查每个响应选项(列)的频率。例如:

library(tidyverse)
set.seed(1234)
responses<-c("Checked","Unchecked")
numobs<-10

my_example<-data.frame(id=1:10,Response_Option_A=sample(responses,numobs,replace=TRUE),Response_Option_B=sample(responses,Response_Option_C=sample(responses,Response_Option_D=sample(responses,stringsAsFactors = FALSE)

my_example
#>    id Response_Option_A Response_Option_B Response_Option_C Response_Option_D
#> 1   1         Unchecked         Unchecked         Unchecked           Checked
#> 2   2         Unchecked         Unchecked         Unchecked         Unchecked
#> 3   3         Unchecked         Unchecked         Unchecked           Checked
#> 4   4         Unchecked           Checked         Unchecked           Checked
#> 5   5           Checked         Unchecked         Unchecked           Checked
#> 6   6         Unchecked         Unchecked         Unchecked         Unchecked
#> 7   7           Checked         Unchecked           Checked           Checked
#> 8   8           Checked           Checked         Unchecked         Unchecked
#> 9   9           Checked         Unchecked         Unchecked         Unchecked
#> 10 10         Unchecked         Unchecked         Unchecked           Checked

最初的尝试是尝试这种方法,但是它返回检查的响应总数,而不是每列中的数字。

my_example %>%
  select(starts_with("Response_Option_")) %>%
    summarise(checked=sum(.=="Checked"))
#>   checked
#> 1      13

reprex package(v0.3.0)于2020-08-10创建

感谢您帮助有效总结这些响应。

解决方法

这是一种tidyverse方法,用于按列而不是按行显示响应总数。根据您的措辞,我认为这就是您要寻找的。还包括问题标签中包含的starts_with()函数。

我们可以使用pivot_longer()将响应特征从宽旋转到长,然后使用group_by定义将现有表转换为summarise(的分组表的变量操作用于创建一个新的数据框,其中为分组变量的每种组合提供了行。

library(tidyverse)
set.seed(1234)
responses<-c("Checked","Unchecked")
numobs<-10

my_example<-data.frame(id=1:10,Response_Option_A=sample(responses,numobs,replace=TRUE),Response_Option_B=sample(responses,Response_Option_C=sample(responses,Response_Option_D=sample(responses,stringsAsFactors = FALSE)

my_example %>% 
  pivot_longer(starts_with("Response_"),names_to = "Responses",values_to = "value") %>% 
  group_by(Responses,value) %>%
  summarise(total_responses = n())


#> # A tibble: 8 x 3
#> # Groups:   Responses [4]
#>   Responses         value     total_responses
#>   <chr>             <chr>               <int>
#> 1 Response_Option_A Checked                 4
#> 2 Response_Option_A Unchecked               6
#> 3 Response_Option_B Checked                 2
#> 4 Response_Option_B Unchecked               8
#> 5 Response_Option_C Checked                 1
#> 6 Response_Option_C Unchecked               9
#> 7 Response_Option_D Checked                 6
#> 8 Response_Option_D Unchecked               4

reprex package(v0.3.0)于2020-08-10创建

如果只需要Checked响应,则可以在summarise()操作之后添加以下代码行:

filter(value == "Checked")

#> # A tibble: 4 x 3
#> # Groups:   Responses [4]
#>   Responses         value   total_responses
#>   <chr>             <chr>             <int>
#> 1 Response_Option_A Checked               4
#> 2 Response_Option_B Checked               2
#> 3 Response_Option_C Checked               1
#> 4 Response_Option_D Checked               6
,

检查tidyREDCap软件包。它具有许多功能,可帮助处理来自REDCap的检查所有适用变量。该程序包位于CRAN上,位于github.io的网站上,文章的小插图都位于页面顶部。

,

您可以将summariseacross结合使用:

library(dplyr)
my_example %>%
  summarise(across(starts_with("Response_Option_"),~sum(. == 'Checked')))

#  Response_Option_A Response_Option_B Response_Option_C Response_Option_D
#1                 4                 2                 1                 6

在旧版本的dplyr中,您可以使用summarise_at

my_example %>%
     summarise_at(vars(starts_with("Response_Option_")),~sum(. == 'Checked'))
,

一个非常base R的解决方案是:

my_example$checked <- apply(my_example[,which(grepl('Response_Option_',names(my_example)))],1,function(x) length(which(x=="Checked")))

输出:

   id Response_Option_A Response_Option_B Response_Option_C Response_Option_D checked
1   1         Unchecked         Unchecked         Unchecked           Checked       1
2   2         Unchecked         Unchecked         Unchecked         Unchecked       0
3   3         Unchecked         Unchecked         Unchecked           Checked       1
4   4         Unchecked           Checked         Unchecked           Checked       2
5   5           Checked         Unchecked         Unchecked           Checked       2
6   6         Unchecked         Unchecked         Unchecked         Unchecked       0
7   7           Checked         Unchecked           Checked           Checked       3
8   8           Checked           Checked         Unchecked         Unchecked       2
9   9           Checked         Unchecked         Unchecked         Unchecked       1
10 10         Unchecked         Unchecked         Unchecked           Checked       1

这也是@ r2evans积分的一种非常理想的方式:

my_example$checked <- rowSums(my_example[,grep("^Response_",colnames(my_example))] == "Checked")

哪个会产生相同的先前输出,并且更具可读性。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...