如何解决使用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的网站上,文章的小插图都位于页面顶部。
您可以将summarise
与across
结合使用:
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 举报,一经查实,本站将立刻删除。