【问题标题】:I want to create a new column in rstudio through mutate function using data from multiple columns我想使用来自多列的数据通过 mutate 函数在 rstudio 中创建一个新列
【发布时间】:2020-12-15 23:16:14
【问题描述】:

我有一个包含超过 1000 万个变量的数据集。它有 25 列用于诊断代码。每行代表一名患者。根据入院诊断代码生成,它可以放置在第 1 到 25 列之间的任何位置。我想为疾病 A 创建一个新列,其代码范围为 480,481,482,483,484,V334,V555。如果这 25 列中存在这些代码中的任何一个,则新列应返回值 1,否则为 0。

原表:

DX1 DX2 DX3 DX4. DX5. DX6. DX7. DX8. DX9. DX10. DX11.
481 482
V334
484
485.
V555 481
F666
G765 481

我希望新列具有 0 或 1 个变量,即使其中一行具有值:480,481,482,483,484,V334,V555。例如

DX1 DX2 DX3 DX4. DX5. DX6. DX7. DX8. DX9. DX10. DX11. NewCol
481 482 1
V334 0
484 1
485. 1
V555 481 1
F666 0
G765 481 1

我尝试过使用:

%>%mutate(NewCol = recode(DX1,
                        "486" = "1",
                        .default = "0")) 

但这仅适用于列 DX1 和变量 486。我想申请 25 个连续列,范围从 DX1:DX25 并包括所有变量 480,481,482,483,484,V334,V555。谢谢!

【问题讨论】:

  • 请提供一个可重现的例子:stackoverflow.com/questions/5963269/…
  • 使用 tidyr::pivot_longer() 重塑您的数据集,使这 25 列成为一列,而不是使用 dplyr::case_when() 重新编码和分组条件。
  • 您应该提供一个小示例来说明您的数据与预期输出的外观。见how to give a reproducible example
  • 这里是 William3031,Ronak Shah 的例子。
  • 请编辑您的问题并删除答案,而不是发布您的代码作为答案。

标签: r tidyverse dplyr


【解决方案1】:

以后请提供reproducible example。至于您的问题,我会遵循@Phil 的建议,并在添加患者编号索引后转向长格式数据。然后你只需要按行分组并选择最大值(它将是1或0),然后与原始数据重新合并。

library(tidyverse)

#Read In Data
df <- data.frame(
  patient = c(1:7),
  dx1 = c('481',NA,NA,NA,'V555','F666',NA),
  dx2 = c(NA,NA,NA,NA,NA,NA,NA),
  dx3 = c(NA,NA,NA,NA,NA,NA,NA),
  dx4 = c(NA,NA,NA,NA,NA,NA,NA),
  dx5 = c(NA,NA,'484',NA,NA,NA,NA),
  dx6 = c('482',NA,NA,'485',NA,NA,NA),
  dx7 = c(NA,NA,NA,NA,NA,NA,NA),
  dx8 = c(NA,NA,NA,NA,NA,NA,NA),
  dx9 = c(NA,NA,NA,NA,NA,NA,NA),
  dx10 = c(NA,'V334',NA,NA,'481',NA,'481')
)

# Declare variables to count
valList = c('481','482','483','484','V334','V555')

#Count, Group, and Rejoin
df %>%
  pivot_longer(cols = dx1:dx10,
               names_to = 'columns',
               values_to = 'values') %>%
  mutate(in_valList = ifelse(values %in% valList,1,0)) %>%
  group_by(patient) %>% 
  summarise(NewCol = max(in_valList,na.rm = T)) %>%
  left_join(df,by='patient')

输出最终看起来像这样,如果你绝对必须在最后有 NewCol,你可以随意重新排序。

# A tibble: 7 x 12
  patient NewCol dx1   dx2   dx3   dx4   dx5   dx6   dx7   dx8   dx9   dx10 
    <int>  <dbl> <chr> <lgl> <lgl> <lgl> <chr> <chr> <lgl> <lgl> <lgl> <chr>
1       1      1 481   NA    NA    NA    NA    482   NA    NA    NA    NA   
2       2      1 NA    NA    NA    NA    NA    NA    NA    NA    NA    V334 
3       3      1 NA    NA    NA    NA    484   NA    NA    NA    NA    NA   
4       4      0 NA    NA    NA    NA    NA    485   NA    NA    NA    NA   
5       5      1 V555  NA    NA    NA    NA    NA    NA    NA    NA    481  
6       6      0 F666  NA    NA    NA    NA    NA    NA    NA    NA    NA   
7       7      1 NA    NA    NA    NA    NA    NA    NA    NA    NA    481  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 2020-10-06
    • 2016-06-15
    • 2019-09-18
    • 2023-01-29
    • 1970-01-01
    • 2015-09-25
    相关资源
    最近更新 更多