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

如何解决使用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")

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?