r - 如何计算条件间隔的案例?小费

标签 r dplyr tibble

所以我希望我能表达我的问题,这里我有以下我编造的例子:

result <- c(1,1,1,1,1,1,1,1,1,1)
con1 <- c(1,2,2,2,1,1,2,2,2,2)
con2 <- c(2,1,2,2,1,1,2,2,2,1)
con3 <- c(2,2,1,1,1,2,2,2,2,1)
con4 <- c(2,1,2,2,1,1,2,1,1,2)
con5 <- c(1,2,2,2,1,2,2,2,2,1)
a <- tibble(Result=result,Con1=con1,Con2=con2,Con3=con3,Con4=con4,Con5=con5)

上面的代码给了我下面的小标题,其中每一行都是一个病人:

> a
# A tibble: 10 x 6
   Result  Con1  Con2  Con3  Con4  Con5
    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1      1     1     2     2     2     1
 2      1     2     1     2     1     2
 3      1     2     2     1     2     2
 4      1     2     2     1     2     2
 5      1     1     1     1     1     1
 6      1     1     1     2     1     2
 7      1     2     2     2     2     2
 8      1     2     2     2     1     2
 9      1     2     2     2     1     2
10      1     2     1     1     2     1

结果是对市长疾病呈阳性的病例(这就是为什么所有病例都是 1 的原因),而 Con_i 是对患者的是或否问题,其中 1=yes 和 2=no,我想知道有多少患者回答是:0 个问题、1 个问题、2-3 个问题和 4 个或更多问题。

到目前为止,我已经尝试这样做了:

a1 <-a %>% add_column(X=1) 
a1$X <- case_when(a$Con1==2 & a$Con2==2 & a$Con3==2 & a$Con4==2 & a$Con5==2 ~ 0,
                    a$Con1==1 & a$Con2==2 & a$Con3==2 & a$Con4==2 & a$Con5==2 |
                    a$Con1==2 & a$Con2==1 & a$Con3==2 & a$Con4==2 & a$Con5==2|
                    a$Con1==2 & a$Con2==2 & a$Con3==1 & a$Con4==2 & a$Con5==2|
                    a$Con1==2 & a$Con2==2 & a$Con3==2 & a$Con4==1 & a$Con5==2|
                    a$Con1==2 & a$Con2==2 & a$Con3==2 & a$Con4==2 & a$Con5==1 ~ 1)
table <- a1 %>% group_by(X) %>% count(X,Result)
table
> table
# A tibble: 3 x 3
# Groups:   X [3]
      X Result     n
  <dbl>  <dbl> <int>
1     0      1     1
2     1      1     4
3    NA      1     5

但我知道这不是最有效的方法,而且我需要为 2-3 种情况和 4 种以上的情况进行所有组合并且不可扩展,所以我正在寻找一种更简单的方法来做到这一点并且缩放它,希望我能得到你的帮助并提前致谢!

最佳答案

也许是最简单的:

table(rowSums(a[,-1] < 2))
# 0 1 2 3 5     <--- counts of "1" in each row
# 1 4 2 2 1     <--- number of patients with that count

既然需要分组2-3和4+,那么

table(cut(rowSums(a[,-1] < 2), c(0, 1, 2, 4, Inf), include.lowest = TRUE))
#   [0,1]   (1,2]   (2,4] (4,Inf] 
#       5       2       2       1 

虽然逻辑正在使用 < 2 , 检查 == 1L 同样容易或类似的平等。


逐步追踪:

a[,-1] == 1
#        Con1  Con2  Con3  Con4  Con5
#  [1,]  TRUE FALSE FALSE FALSE  TRUE
#  [2,] FALSE  TRUE FALSE  TRUE FALSE
#  [3,] FALSE FALSE  TRUE FALSE FALSE
#  [4,] FALSE FALSE  TRUE FALSE FALSE
#  [5,]  TRUE  TRUE  TRUE  TRUE  TRUE
#  [6,]  TRUE  TRUE FALSE  TRUE FALSE
#  [7,] FALSE FALSE FALSE FALSE FALSE
#  [8,] FALSE FALSE FALSE  TRUE FALSE
#  [9,] FALSE FALSE FALSE  TRUE FALSE
# [10,] FALSE  TRUE  TRUE FALSE  TRUE
rowSums(a[,-1] == 1)
#  [1] 2 2 1 1 5 3 0 1 1 3

最后是每个“患者”(行)的 1 的数量。

据此,我数一0 , 四 1 s,两个 2 s加二3小号,零 4 s加一5 .这应该总共是 5、2、2、1 ... 所以 @andrew_reece 是正确的,让我们使用 cut(...,right=FALSE) :

table(cut(rowSums(a[,-1] < 2), c(0, 1, 2, 4, Inf), right = FALSE))
#   [0,1)   [1,2)   [2,4) [4,Inf) 
#       1       4       4       1 

我应该早点捕获 [0,1] (上一个答案),表示 0 和 1 是封闭的,意味着 0 和 1 都包含在同一个 bin 中。

关于r - 如何计算条件间隔的案例?小费,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64163816/

相关文章:

r - 使用 tidyverse (dplyr) 标准化混合数字/非数字 DataFrame 中的列?

r - 在 dplyr 链中转换 Excel 日期格式

r - 使用 {tibble} 中的 enframe 将 tibble 中的列表列转换为多列

string - 通过删除连续的重复项来减少字符串长度

r - 升级Tinn-R

r - 在 R 中使用 grep 从 data.frame 中删除行

r - 列式计算

dplyr 中的 R 粘贴函数没有按预期迭代

r - 使用 R 中所有选定的列名称创建一个新列

r - 如何将R对象的结构打印到控制台