如何仅更换“之前”的零件:&引用;在R中列的每一行中

如何仅更换“之前”的零件:&引用;在R中列的每一行中,r,dplyr,tidyverse,R,Dplyr,Tidyverse,因此,在数据集中,我有一个名为“干预”的列,每一行如下所示: 第1行:“药物:美罗华|药物:乌托米卢|药物:阿维鲁单抗|药物:PF04518600” 第2行:“生物学:阿来单抗|生物学:供体淋巴细胞|药物:卡莫司汀|药物:阿糖胞苷|药物:足叶乙甙|药物:美法仑|程序:异基因骨髓移植” 我只想提取干预类型,如“药物”、“生物”、“程序”,以保留在列中。甚至更好的是,如果能有独特的干预类型,而不是像第一排那样的“药物”4次 预期输出如下所示: 第1行:“药物” 第2行:“生物、药物、程序” 我刚刚开

因此,在数据集中,我有一个名为“干预”的列,每一行如下所示:

第1行:“药物:美罗华|药物:乌托米卢|药物:阿维鲁单抗|药物:PF04518600”

第2行:“生物学:阿来单抗|生物学:供体淋巴细胞|药物:卡莫司汀|药物:阿糖胞苷|药物:足叶乙甙|药物:美法仑|程序:异基因骨髓移植”

我只想提取干预类型,如“药物”、“生物”、“程序”,以保留在列中。甚至更好的是,如果能有独特的干预类型,而不是像第一排那样的“药物”4次

预期输出如下所示:

第1行:“药物”

第2行:“生物、药物、程序”


我刚刚开始使用r,我已经安装了tidyverse,并且有点习惯于使用%>%。如果有人能帮我,非常感谢

如果我们只想提取
前面的前缀部分:

library(dplyr)
library(stringr)
library(tidyr)
library(purrr)
df1 %>%
   mutate(Interventions = map_chr(str_extract_all(Interventions, 
          "\\w+(?=:)"), ~ toString(sort(unique(.x)))))
#               Interventions
#1                        Drug
#2 Biological, Drug, Procedure

或者另一个选项是根据分隔符分隔行,
切片
备用行,并将
排序
ed
唯一
值粘贴在一起

df1 %>%
   mutate(rn = row_number()) %>% 
   separate_rows(Interventions, sep="[:|]") %>% 
   group_by(rn) %>% 
   slice(seq(1, n(), by = 2)) %>%
   distinct() %>%
   summarise(Interventions = toString(sort(unique(Interventions)))) %>%
   ungroup %>% 
   select(-rn)
# A tibble: 2 x 1
#    Interventions              
#  <chr>                      
#1 Drug                       
#2 Biological, Drug, Procedure
df1%>%
变异(rn=行数())%>%
单独的_行(干预,sep=“[:|]”)%>%
分组依据(rn)%>%
切片(seq(1,n(),by=2))%>%
不同的()%>%
总结(干预=toString(排序(唯一(干预)))%>%
解组%>%
选择(-rn)
#一个tibble:2x1
#干预措施
#                        
#1药物
#2生物、药物、程序
数据
df1不像Akruns那样简洁和相同的逻辑,而是在Base R中:

# Create df: 

df1 <- structure(list(Interventions = c("Drug: Rituximab|Drug: Utomilumab|Drug: Avelumab|Drug: PF04518600", 
                                        "Biological: alemtuzumab|Biological: donor lymphocytes|Drug: carmustine|Drug: cytarabine|Drug: etoposide|Drug: melphalan|Procedure: allogeneic bone marroow"
)), class = "data.frame", row.names = c(NA, -2L))

# Assign a row id vec: 

df1$row_num <- 1:nrow(df1)

# Split string on | delim: 

split_up <- strsplit(df1$Interventions, split = "[|]")

# Roll down the dataframe - keep uniques: 

rolled_out <- unique(data.frame(row_num = rep(df1$row_num, sapply(split_up, length)),

                             Interventions = gsub("[:].*","", unlist(split_up))))

# Stack the dataframe: 

df2 <- aggregate(Interventions~row_num, rolled_out, paste0, collapse = ", ")

# Drop id vec: 

df2 <- within(df2, rm("row_num"))
#创建df:

df1您好,谢谢您的回复,但是,因为这一列中只有两个数据示例,所以干预类型比这三个多。最初,数据集的每一行代表一个独特的临床试验。所以我这里不需要特定药物的名称,只需要干预的类型,我希望它们在同一行中。预期输出为第1行:“药物”;第2行:“生物、药物、程序”。
# Create df: 

df1 <- structure(list(Interventions = c("Drug: Rituximab|Drug: Utomilumab|Drug: Avelumab|Drug: PF04518600", 
                                        "Biological: alemtuzumab|Biological: donor lymphocytes|Drug: carmustine|Drug: cytarabine|Drug: etoposide|Drug: melphalan|Procedure: allogeneic bone marroow"
)), class = "data.frame", row.names = c(NA, -2L))

# Assign a row id vec: 

df1$row_num <- 1:nrow(df1)

# Split string on | delim: 

split_up <- strsplit(df1$Interventions, split = "[|]")

# Roll down the dataframe - keep uniques: 

rolled_out <- unique(data.frame(row_num = rep(df1$row_num, sapply(split_up, length)),

                             Interventions = gsub("[:].*","", unlist(split_up))))

# Stack the dataframe: 

df2 <- aggregate(Interventions~row_num, rolled_out, paste0, collapse = ", ")

# Drop id vec: 

df2 <- within(df2, rm("row_num"))