#r #string #dplyr
Вопрос:
У меня есть фрейм данных, в котором есть столбец с именем line_name. Имя строки содержит строки, разделенные запятыми. (например, «A, B, C»)
Если какая-либо строка из списка pdl1_mono находится в имени строки, я хочу, чтобы это слово появилось первым. Прямо сейчас список слов в имени строки упорядочен в алфавитном порядке. По сути, я пытаюсь обновить порядок строк в столбце Line_name.
Например,если имя строки = «карбоплатин,паклитаксел, пембролизумаб», поскольку «пембролизумаб» находится в списке pdl1_mono,я хочу обновить его до «пембролизумаб,карбоплатин, паклитаксел».
pdl1_mono <- c('atezolizumab', 'cemiplimab', 'durvalumab', 'nivolumab', 'nivolumab,ipilimumab',
'pembrolizumab')
df <- df %>%
mutate(
line_name = sub('^(.*),pembrolizumab', 'pembrolizumab,\1', line_name),
line_name = sub('^(.*),nivolumab', 'nivolumab,\1', line_name)
)
Я могу обновить с помощью функции sub() для каждого элемента из списка pdl1_mono. Можем ли мы использовать какую-либо динамическую функцию для обновления столбца Line_name вместо ручного повторения для каждого элемента? Я пытался использовать карту, но я думаю, что это неправильно. Все время появляется ошибка
df1 <- df %>%
mutate(
line_name =
case_when(str_detect(line_name, paste(pdl1_mono, collapse = "|")) ~ map(pdl1_mono,
sub(paste0("^(.*),",.,"'"), paste0(.,",\1"), line_name)),
TRUE ~. ))
Вот образец набора данных для тестирования
structure(list(patient_id = c("FB686A25501E9", "F8B1ED05646B2",
"FC3D22E4CC73C", "F26230CDC7E74", "F22AF8C94E657", "FAF785C1A151A",
"F6E1B8F6F0EA9", "F428FFA3E8E61", "F6B57AFAF6B24", "FA7560BD1D1AD",
"FAAC879CAF38F", "F1C824D17FCB9", "F25182C921986", "F890B3306D38F",
"FF26E35E93510", "FB4FB81ACD59D", "FA32928EF3D5B", "FA7D9EBBD7483",
"FF3F362DE9D91", "F0BA038C8DD49"), line_name = c("bevacizumab,carboplatin,pemetrexed",
"dabrafenib,trametinib", "gemcitabine,paclitaxel", "nivolumab",
"carboplatin,paclitaxel protein-bound", "cisplatin,etoposide",
"paclitaxel,pertuzumab,trastuzumab", "carboplatin,paclitaxel protein-bound,pembrolizumab",
"carboplatin,gemcitabine", "afatinib,carboplatin,pembrolizumab,pemetrexed",
"paclitaxel protein-bound", "bevacizumab,carboplatin,pemetrexed",
"carboplatin,docetaxel", "cisplatin,etoposide", "carboplatin,paclitaxel protein-bound",
"carboplatin,pemetrexed", "nivolumab", "afatinib", "carboplatin,paclitaxel",
"bevacizumab,carboplatin,pemetrexed")), row.names = c(NA, -20L
), class = c("tbl_df", "tbl", "data.frame"))
Комментарии:
1. Было бы гораздо
Rtistic
проще распределить их по нескольким строкам и рассматривать их как упорядоченные факторы. Есть ли причина, по которой они должны быть в одной строке?2. @coffeinjucky, Это часть огромного стола. Имя строки может быть длинным списком строк. И я должен отображать его в различных таблицах и графиках в отсортированном порядке.
3. Я думаю , что ты хочешь
%in%
, а неmap
этого, но мойdplyr
не так уж и хорош.
Ответ №1:
Пожалуйста, проверьте это:
library(tidyverse)
re_do <- function(string, group){
vec <- unlist(strsplit(string, ','))
i <- which(vec %in% group)
if(length(i)>0){
new_vec <- paste0(c(vec[i], vec[-i]), collapse=',')
return(new_vec)
}
else{
return(string)
}
}
df %>%
rowwise() %>%
mutate(new_vec = re_do(line_name, pdl1_mono))
# A tibble: 20 x 3
# Rowwise:
patient_id line_name new_vec
<chr> <chr> <chr>
1 FB686A25501E9 bevacizumab,carboplatin,pemetrexed bevacizumab,carboplatin,pemetrexed
2 F8B1ED05646B2 dabrafenib,trametinib dabrafenib,trametinib
3 FC3D22E4CC73C gemcitabine,paclitaxel gemcitabine,paclitaxel
4 F26230CDC7E74 nivolumab nivolumab
5 F22AF8C94E657 carboplatin,paclitaxel protein-bound carboplatin,paclitaxel protein-bound
6 FAF785C1A151A cisplatin,etoposide cisplatin,etoposide
7 F6E1B8F6F0EA9 paclitaxel,pertuzumab,trastuzumab paclitaxel,pertuzumab,trastuzumab
8 F428FFA3E8E61 carboplatin,paclitaxel protein-bound,pembrolizumab pembrolizumab,carboplatin,paclitaxel protein-bound
9 F6B57AFAF6B24 carboplatin,gemcitabine carboplatin,gemcitabine
10 FA7560BD1D1AD afatinib,carboplatin,pembrolizumab,pemetrexed pembrolizumab,afatinib,carboplatin,pemetrexed
11 FAAC879CAF38F paclitaxel protein-bound paclitaxel protein-bound
12 F1C824D17FCB9 bevacizumab,carboplatin,pemetrexed bevacizumab,carboplatin,pemetrexed
13 F25182C921986 carboplatin,docetaxel carboplatin,docetaxel
14 F890B3306D38F cisplatin,etoposide cisplatin,etoposide
15 FF26E35E93510 carboplatin,paclitaxel protein-bound carboplatin,paclitaxel protein-bound
16 FB4FB81ACD59D carboplatin,pemetrexed carboplatin,pemetrexed
17 FA32928EF3D5B nivolumab nivolumab
18 FA7D9EBBD7483 afatinib afatinib
19 FF3F362DE9D91 carboplatin,paclitaxel carboplatin,paclitaxel
20 F0BA038C8DD49 bevacizumab,carboplatin,pemetrexed bevacizumab,carboplatin,pemetrexed
Комментарии:
1. Поскольку rowwise() группирует входные данные по строкам, мне пришлось разгруппировать() после мутации, но это решение сработало. Спасибо
2. Рад, что смог помочь.