首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将R中列的每一行中的":“替换为”:“之前的部分

如何将R中列的每一行中的":“替换为”:“之前的部分
EN

Stack Overflow用户
提问于 2019-10-12 21:07:24
回答 2查看 83关注 0票数 2

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

row1:“药物:利妥昔单抗-药物:Utomilumab-药物:Avelumab-药物: PF04518600”

row2:“生物学:alemtuzumab-生物学:供体淋巴细胞-药物:卡莫嗪药物:阿糖胞苷药物:依托泊苷药物:三聚氰胺程序:异基因骨丸”

我只想提取“药物”、“生物”、“程序”等干预类型留在专栏中。更好的是,如果只能有独特的干预类型,而不是像第一行那样的4倍的“药物”。

预期的输出如下所示:

row1:“毒品”

row2:“生物、药物、程序”

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-12 21:13:44

如果我们只想在:之前提取前缀部分

代码语言:javascript
复制
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

或者另一种选择是根据分隔符、slice替换行和paste一起分隔行,在“干预”中将sorted unique值分开。

代码语言:javascript
复制
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

数据

代码语言:javascript
复制
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))
票数 2
EN

Stack Overflow用户

发布于 2019-10-13 07:58:30

不像Akrun那样简洁和相同的逻辑,但是在Base R中:

代码语言:javascript
复制
# 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"))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58358515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档