【问题标题】:how to bring one column string into the first one, with library tidyverse?如何使用库 tidyverse 将一个列字符串带入第一个字符串?
【发布时间】:2021-07-28 23:21:06
【问题描述】:

我正在尝试从 med_name_two 中获取一个列字符串,该列附加到基于 med_name_one 的列名。但条件是在第一列中的字符串哌拉西林之后是第二列中的他唑巴坦。数据集示例如下。可以看到,med_name_one 中的最后一行是 Pipperalicin,然后是 med_name_two 中的 Tazobactam。我想以这种格式“哌拉西林-他唑巴坦”将“他唑巴坦”附加到“哌拉西林”。只想在 R

中使用 tidyverse 库来实现这一点
structure(list(id = c(1, 1, 2, 2, 3, 4, 5, 6, 7), med_name_one = c("Co-amoxiclav", 
"doxycycline", "Gentamicin", "Co-trimoxazole", "Gentamicin", 
"Co-trimoxazole", "Sodium Chloride", "Piperacillin", "Piperacillin"
), med_name_two = c(NA, "Gentamicin", "Co-trimoxazole", NA, NA, 
NA, NA, NA, "Tazobactam"), mg_one = c("411 mg", "120 mg", "11280 mg", 
"8 mg", "11280 mg", "8 mg", "411 mg", "120 mg", NA), mg_two = c(NA, 
"11280 mg", "8 mg", NA, NA, NA, NA, NA, NA), administration_datetime = c("2020-01-03 10:08", 
"2020-01-01 11:08", "2020-01-02 19:08", "2020-01-08 20:08", "2020-01-02 19:08", 
"2020-01-08 20:08", "2019-01-30 08:08", "2020-01-03 09:08", "2020-01-03 09:08"
)), row.names = c(NA, -9L), class = c("tbl_df", "tbl", "data.frame"
))

我想要哌拉西林-他唑巴坦的输出。见下表。

 id med_name_one            med_name_two   mg_one   mg_two   administration_datetime
<dbl> <chr>                   <chr>          <chr>    <chr>    <chr>                  
1     1 Co-amoxiclav            NA             411 mg   NA       2020-01-03 10:08       
2     1 doxycycline             Gentamicin     120 mg   11280 mg 2020-01-01 11:08       
3     2 Gentamicin              Co-trimoxazole 11280 mg 8 mg     2020-01-02 19:08       
4     2 Co-trimoxazole          NA             8 mg     NA       2020-01-08 20:08       
5     3 Gentamicin              NA             11280 mg NA       2020-01-02 19:08       
6     4 Co-trimoxazole          NA             8 mg     NA       2020-01-08 20:08       
7     5 Sodium Chloride         NA             411 mg   NA       2019-01-30 08:08       
8     6 Piperacillin            NA             120 mg   NA       2020-01-03 09:08       
9     7 Piperacillin-tazobactam NA             NA       NA       2020-01-03 09:08    

【问题讨论】:

  • 我不清楚到底想得到什么。你能澄清一下吗?
  • 做了一些改变。 :)

标签: r string tidyverse


【解决方案1】:

我们可以使用case_when创建一个逻辑向量并粘贴两列

library(dplyr)
library(stringr)
df1 %>%
    mutate(i1 = med_name_one == 'Piperacillin' & 
          med_name_two %in% 'Tazobactam',  med_name_one = case_when(i1 ~ 
     str_c(med_name_one, tolower(med_name_two), sep='-'), TRUE ~ med_name_one),  
     med_name_two = replace(med_name_two, i1, NA_character_), i1 = NULL)

-输出

# A tibble: 9 x 6
#     id med_name_one            med_name_two   mg_one   mg_two   administration_datetime
#  <dbl> <chr>                   <chr>          <chr>    <chr>    <chr>                  
#1     1 Co-amoxiclav            <NA>           411 mg   <NA>     2020-01-03 10:08       
#2     1 doxycycline             Gentamicin     120 mg   11280 mg 2020-01-01 11:08       
#3     2 Gentamicin              Co-trimoxazole 11280 mg 8 mg     2020-01-02 19:08       
#4     2 Co-trimoxazole          <NA>           8 mg     <NA>     2020-01-08 20:08       
#5     3 Gentamicin              <NA>           11280 mg <NA>     2020-01-02 19:08       
#6     4 Co-trimoxazole          <NA>           8 mg     <NA>     2020-01-08 20:08       
#7     5 Sodium Chloride         <NA>           411 mg   <NA>     2019-01-30 08:08       
#8     6 Piperacillin            <NA>           120 mg   <NA>     2020-01-03 09:08       
#9     7 Piperacillin-tazobactam <NA>           <NA>     <NA>     2020-01-03 09:08       

或使用base R

i1 <- with(df1, med_name_one == 'Piperacillin' &  
          med_name_two %in% 'Tazobactam')

df1$med_name_one[i1] <- paste(df1$med_name_one[i1], 
        tolower(df1$med_name_two[i1]), sep='-')
df1$med_name_two[i1] <- NA

【讨论】:

  • 有没有办法以这种格式获得这个 - '哌拉西林-他唑巴坦'而不是'哌拉西林-他唑巴坦'
  • @GaB 你需要tolower updatd
  • 如果我使用 tolower 那么它会给我所有的字符串来降低,而我只想降低 'tazobactam'。
  • @GaB 如果你检查我的代码,我只在 med_name_two str_c(med_name_one, tolower(med_name_two), sep='-') 上这样做过
【解决方案2】:

另一种基本 R 方法:

a <- do.call(paste, c(df, sep=","))
b <- sub("Piperacillin,Tazobactam", "Piperacillin-tazobactam,NA", a)
read.csv(text = a, col.names = names(df), header = FALSE)

 id            med_name_one   med_name_two   mg_one   mg_two administration_datetime
1  1            Co-amoxiclav           <NA>   411 mg     <NA>        2020-01-03 10:08
2  1             doxycycline     Gentamicin   120 mg 11280 mg        2020-01-01 11:08
3  2              Gentamicin Co-trimoxazole 11280 mg     8 mg        2020-01-02 19:08
4  2          Co-trimoxazole           <NA>     8 mg     <NA>        2020-01-08 20:08
5  3              Gentamicin           <NA> 11280 mg     <NA>        2020-01-02 19:08
6  4          Co-trimoxazole           <NA>     8 mg     <NA>        2020-01-08 20:08
7  5         Sodium Chloride           <NA>   411 mg     <NA>        2019-01-30 08:08
8  6            Piperacillin           <NA>   120 mg     <NA>        2020-01-03 09:08
9  7 Piperacillin-tazobactam           <NA>     <NA>     <NA>        2020-01-03 09:08

【讨论】:

    猜你喜欢
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 2012-08-14
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    相关资源
    最近更新 更多