Как заменить только часть перед ":" в каждой строке столбца в R - PullRequest
2 голосов
/ 13 октября 2019

поэтому в наборе данных у меня есть столбец с именем «Вмешательства», и каждая строка выглядит следующим образом:

row1 : «Препарат: Ритуксимаб | Препарат: Утомилумаб | Препарат: Авелумаб| Препарат: PF04518600 "

row2 :" Биологический: алемтузумаб | Биологический: донорские лимфоциты | Препарат: кармустин | Препарат: цитарабин | Препарат: этопозид | Препарат: мелфалан | Процедура: аллогенный костный мозг"

Я хочу извлечь только столбец Тип вмешательства , такой как" Препарат "," Биологический "," Процедура ", чтобы остаться в столбце. И даже лучше, если только может иметь уникальный тип вмешательства вместо «наркотиков» в 4 раза, как в первом ряду.

Ожидаемый результат будет выглядеть следующим образом:

row1 : «Drug»

row2 : «Biological, Drug,Процедура "

Я только начинаю с r, у меня установлена ​​ tidyverse и вроде как играю с %>% . Если кто-нибудь может помочь мне с этим, высоко ценится!

Ответы [ 2 ]

2 голосов
/ 13 октября 2019

Если мы хотим извлечь только часть префикса перед :

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 вместе sort ed unique значений в 'вмешательствах

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 <- 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))
1 голос
/ 13 октября 2019

Не такая краткая и такая же логика, как у Акрунса, но в 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"))
...