【问题标题】:Create a new column using mutate_at() in R在 R 中使用 mutate_at() 创建一个新列
【发布时间】:2020-04-23 16:38:02
【问题描述】:

我正在尝试对下一个数据框进行一些修改:

df <- data.frame(
    zgen = c("100003446", "100001749","100002644","100001755"),
    Name_mat = c("EVEROLIMUS 10 MG CM", "GALSULFASA 5MG/5ML FAM", "IDURSULFASE 2MG/ML SOL. P/INFUSION FAM","IMIGLUCERASA 400U POL. LIOF. FAM"),
    details= c("CM", "FAM", "SOL. P/INFUSION FAM","NA")
)

我正在使用dplyr 包中的mutate_at() 创建一个名为“type”的新列。该列可以根据我的数据框列中出现的字符列表(“name_mat”和“details”)而改变。代码是:

df <- df %>% mutate_at(vars(one_of("Name_mat ","details")),
                       funs(case_when( "FAM|FRA" == TRUE ~ "FA",
                                       "CM|COMPRIMIDO" == TRUE~ "COM",
                                       "SOL"== TRUE~"SOL",
                                       "CP|CAPSULA"== TRUE~"CAP",
                                       TRUE ~ "bad_mat")))

我第一次使用 mutate_at,但我不知道如何在我的数据框“df”中创建一个名为“type”的新列。最后我需要类似的东西:

       ZGEN                                 Name_mat               details   Type
1 100003446                      EVEROLIMUS 10 MG CM                    CM    COM
2 100001749                   GALSULFASA 5MG/5ML FAM                   FAM     FA
3 100002644   IDURSULFASE 2MG/ML SOL. P/INFUSION FAM   SOL. P/INFUSION FAM     FA
4 100001755         IMIGLUCERASA 400U POL. LIOF. FAM                    NA     FA

感谢任何帮助或有关如何执行此操作的任何其他观点。

谢谢!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    试着这样做

      library(tidyverse)
      library(stringr)
    
      df %>% mutate(TYPE = case_when(
      str_detect(Name_mat, pattern = "FAM") | str_detect(details, "FRA") ~ "FA",
      str_detect(Name_mat, pattern = "CM") | str_detect(details, "COMPRIMODO") ~ "CM",
      str_detect(Name_mat, pattern = "SOL") ~ "SOL",
      str_detect(Name_mat, pattern = "CP") | str_detect(details, "CAPSULA") ~ "CAP",
      TRUE ~ "bad_mat"))
    

    【讨论】:

      【解决方案2】:

      我们也可以使用

      library(dplyr)
      library(purrr)
      library(stringr)
      pat <- "\\b(FAM|FRA|CM|COMPRIMIDO|SOL|CP|CAPSULA)\\b"
      
      nm1 <- setNames(c("FA", "FA", "COM", "COM", "SOL", "CAP", "CAP"),
             c("FAM", "FRA", "CM", "COMPRIMIDO", "SOL", "CP", "CAPSULA"))
      df %>% 
           select(Name_mat, details) %>%
           map(str_extract_all, pattern = pat) %>% 
                 transpose %>% 
           map_chr( ~ nm1[flatten_chr(.x)][1] ) %>%
           bind_cols(df, Type = .)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-21
        • 1970-01-01
        • 1970-01-01
        • 2019-08-12
        相关资源
        最近更新 更多