R语言 根据条件生成新变量的函数

2ledvvac  于 2023-04-03  发布在  其他
关注(0)|答案(3)|浏览(203)

我有这个数据集

dt <- data.table(ID = c(1, 2, 3, 4),
                 sex = c("Man", "Woman", "Man", "Woman"),
                 age = c(35, 50, 23, 78),
                 q1= c(1, NA, NA, 1), 
                 q2= c(1, 3, 2, NA), 
                 q3= c(2, 1, 4, 4))

我需要根据q1,q2,q3创建新的变量,但我想对这些值进行分组;因此,值为1、2所有= YES,值为3的所有= NO,值为4的所有= IDK
因此,最终数据集应为

ID sex   age q1 q2 q3 q1_cat q2_cat q3_cat
    1  Man    35  1  1  2   YES     YES     YES     
    2  Woman  50  NA 3  1   NA      NO      YES 
    3  Man    23  NA 2  4  NA       NO      IDK
    4  Woman  78  1 NA  4  YES      NA      IDK
3phpmpom

3phpmpom1#

我知道这是标记数据表,但另一种方法是使用dplyr::mutate()dplyr::across(),其中.names参数和dplyr::case_when用于逻辑:

library(dplyr)

dt %>%
  mutate(across(q1:q3, ~case_when(.x %in% 1:2 ~ "Yes", 
                                  .x %in% 3 ~ "NO",
                                  .x %in% 4 ~ "IDK"),
                .names = "{.col}_cat"))

输出

ID   sex age q1 q2 q3 q1_cat q2_cat q3_cat
1:  1   Man  35  1  1  2    Yes    Yes    Yes
2:  2 Woman  50 NA  3  1   <NA>     NO    Yes
3:  3   Man  23 NA  2  4   <NA>    Yes    IDK
4:  4 Woman  78  1 NA  4    Yes   <NA>    IDK
tgabmvqs

tgabmvqs2#

library(data.table)
nm1 <- paste0("q", 1:3)
nm2 <- setNames(c("YES", "YES", "NO", "IDK"), 1:4)
 dt[, paste0(nm1, "_cat") := lapply(.SD, \(x) nm2[as.character(x)]), 
  .SDcols = nm1]
  • 输出
> dt
   ID   sex age q1 q2 q3 q1_cat q2_cat q3_cat
1:  1   Man  35  1  1  2    YES    YES    YES
2:  2 Woman  50 NA  3  1   <NA>     NO    YES
3:  3   Man  23 NA  2  4   <NA>    YES    IDK
4:  4 Woman  78  1 NA  4    YES   <NA>    IDK
zujrkrfu

zujrkrfu3#

这是添加这些列的一种简单方法,但如果整个数据集有更多问题,则可能会变得笨拙。

library(data.table)
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:data.table':
#> 
#>     between, first, last
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

dt <- data.table(ID = c(1, 2, 3, 4),
                 sex = c("Man", "Woman", "Man", "Woman"),
                 age = c(35, 50, 23, 78),
                 q1= c(1, NA, NA, 1), 
                 q2= c(1, 3, 2, NA), 
                 q3= c(2, 1, 4, 4))

dt %>%
  mutate(q1_cat = 
           case_when(
             q1 == 1 ~ 'YES',
             q1 == 2 ~ 'YES',
             q1 == 3 ~ 'NO',
             q1 == 4 ~ 'IDK'
           ),
         q2_cat = 
           case_when(
             q2 == 1 ~ 'YES',
             q2 == 2 ~ 'YES',
             q2 == 3 ~ 'NO',
             q2 == 4 ~ 'IDK'
           ),
         q3_cat = 
           case_when(
             q3 == 1 ~ 'YES',
             q3 == 2 ~ 'YES',
             q3 == 3 ~ 'NO',
             q3 == 4 ~ 'IDK'
           )
  )
#>    ID   sex age q1 q2 q3 q1_cat q2_cat q3_cat
#> 1:  1   Man  35  1  1  2    YES    YES    YES
#> 2:  2 Woman  50 NA  3  1   <NA>     NO    YES
#> 3:  3   Man  23 NA  2  4   <NA>    YES    IDK
#> 4:  4 Woman  78  1 NA  4    YES   <NA>    IDK

创建于2023-03-27带有reprex v2.0.2
直接更改q1,q2,... qN的内容是否有用?

相关问题