R语言 如何根据多个条件为每个ID分配类

axr492tv  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(135)

我是R的新手,从stackoverflow那里得到了很多帮助!!
我有超过1000人的数据表示某些条件。每个变量由连续变量或分类变量组成。我必须根据3个条件(Q1,Q2,Q3)的组合给每个人贴上**'class'(class A,B,C)**的标签,但是,每个条件都由变量的值决定。有点复杂。
比如说
我的数据是这样的。

var1    var2    var3    var4    var5
id1     1       10       1       0      1.5
id2     0       20       0       2      2.4
id3     0       15       0       1      3.5
id4     1       30       1       1      2.1
.
.
id1000  1       25       1       0      1.2

有3个条件(Q1,Q2,Q3)是这样的。

Q1          Q2       Q3     
var1    1           .        0
var2   15>      15≤ & <25    >25
var3    1           .        0
var4    2           1        0
var5   <2.0         .       ≥2.0

类由每个id的以下内容决定

-If two or more Q1 conditions exist  -> class A
-'one Q1 and more than one Q2' or 'more than two Q2' -> class B
-else -> class C

例如,id 1变量(V1~V5)条件分别为Q1、Q1、Q1、Q3、Q1。因为id 1中存在两个以上的Q1,所以id 1的class将是A。
我在谷歌上搜索了很多天,但很难找到解决方案。如果条件的数量是两个(Q1,Q2),这将是更容易的任务,但不幸的是有3个条件。我尝试应用ifelse语句,但在我看来,它不适用于这种情况

drkbr07n

drkbr07n1#

这有点复杂,但您应该能够使用dplyr package中的case_when()函数将“规则”应用于每个id,即

library(dplyr)

df <- read.table(text = "       var1    var2    var3    var4    var5
id1     1       10       1       0      1.5
id2     0       20       0       2      2.4
id3     0       15       0       1      3.5
id4     1       30       1       1      2.1", header = TRUE)

df %>%
  rowwise() %>%
  mutate(class = case_when(sum(var1 == 1, var2 > 15, var3 == 1, var4 == 2, var5 < 2.0) >= 2 ~ "class A",
                           sum(var1 == 1, var2 > 15, var3 == 1, var4 == 2, var5 < 2.0) == 1 &
                             sum((var2 >= 15 & var2 < 25), var4 == 1) > 1 ~ "class B",
                           TRUE ~ "class C"))
#> # A tibble: 4 × 6
#> # Rowwise: 
#>    var1  var2  var3  var4  var5 class  
#>   <int> <int> <int> <int> <dbl> <chr>  
#> 1     1    10     1     0   1.5 class A
#> 2     0    20     0     2   2.4 class A
#> 3     0    15     0     1   3.5 class C
#> 4     1    30     1     1   2.1 class A

如果将id 2的var 4更改为1,则使用您的规则,该id将落入B类标准:

df2 <- read.table(text = "       var1    var2    var3    var4    var5
id1     1       10       1       0      1.5
id2     0       20       0       1      2.4
id3     0       15       0       1      3.5
id4     1       30       1       1      2.1", header = TRUE)
all.equal(df, df2)
#> [1] "Component \"var4\": Mean relative difference: 0.5"

df2 %>%
  rowwise() %>%
  mutate(class = case_when(sum(var1 == 1, var2 > 15, var3 == 1, var4 == 2, var5 < 2.0) >= 2 ~ "class A",
                           sum(var1 == 1, var2 > 15, var3 == 1, var4 == 2, var5 < 2.0) == 1 &
                             sum((var2 >= 15 & var2 < 25), var4 == 1) > 1 ~ "class B",
                           TRUE ~ "class C"))
#> # A tibble: 4 × 6
#> # Rowwise: 
#>    var1  var2  var3  var4  var5 class  
#>   <int> <int> <int> <int> <dbl> <chr>  
#> 1     1    10     1     0   1.5 class A
#> 2     0    20     0     1   2.4 class B
#> 3     0    15     0     1   3.5 class C
#> 4     1    30     1     1   2.1 class A

创建于2023-05-19带有reprex v2.0.2

相关问题