Разделение элементов в списке - R - PullRequest
0 голосов
/ 28 мая 2020

У меня есть некоторые элементы в моем списке, которые имеют / встроены в них. Я хочу разделить и дублировать их, например, a / b / c z -> становится az bz c z

Это пример моих данных, но я не знаю, как Начало. Есть мысли?

structure(list(keyword = c("deltoid muscle", "teres major/minor muscle", 
"latissimus dorsi muscle", "serratus anterior/posterior superior/inferior muscle", 
"levator scapulae", "rhomboid major/minor muscle", "erector spinae muscle", 
"thoracolumbar fascia.", "Bone â\200“", "Clavicle:")), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"))

например, результат

"rhomboid major/minor muscle"

должен быть

"rhomboid major  muscle"

и

 "rhomboid minor muscle"

Спасибо!

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Вот подход data.table. Я боролся с этим, поэтому код НАИБОЛЕЕ НЕ САМЫЙ / элегантный. Он должен работать независимо от того, сколько ../ .. вариантов представлено в строке (не проверено).

Я открыт для всех улучшений ..

но, похоже, задание выполнено ...

образец данных

library( data.table)
DT <- structure(list(keyword = c("deltoid muscle", "teres major/minor muscle", 
                           "latissimus dorsi muscle", "serratus anterior/posterior superior/inferior muscle", 
                           "levator scapulae", "rhomboid major/minor muscle", "erector spinae muscle", 
                           "thoracolumbar fascia.", "Bone â\200“", "Clavicle:")), row.names = c(NA, 
                                                                                                -10L), class = c("tbl_df", "tbl", "data.frame"))

код

setDT( DT )

#cut string into parts
DT[, paste0( "part_", 1:length( tstrsplit( gsub("([a-z]+\\/[a-z]+)", "~\\1~", DT$keyword ), "~" ) ) ) :=
               tstrsplit( gsub("([a-z]+\\/[a-z]+)", "~\\1~", DT$keyword ), "~" ) ][]

#replace all NA with %-sing (or any other sign that does NOT appear in your data!!)
#it can be removed later on
DT[ is.na(DT) ] <- "%"

#split all .../... values to a vector
cols = grep( "^part_", names(DT), value = TRUE )
DT[, (cols) := lapply( .SD, strsplit, "/" ), .SDcols = cols ][]

#now throw it all together
answer <- data.table::rbindlist( lapply( transpose( DT[, .SD, .SDcols = cols ] ), function(x) do.call( expand.grid, x ) ) )
answer[, final := Reduce( function(...) paste0(..., sep = ""), .SD[, mget(cols)])]

#now remove the "%"-sing
gsub( "%", "", answer$final )

вывод

выглядит нормально ...

# [1] "deltoid muscle"                     "teres major muscle"                 "teres minor muscle"                
# [4] "latissimus dorsi muscle"            "serratus anterior superior muscle"  "serratus posterior superior muscle"
# [7] "serratus anterior inferior muscle"  "serratus posterior inferior muscle" "levator scapulae"                  
# [10] "rhomboid major muscle"              "rhomboid minor muscle"              "erector spinae muscle"             
# [13] "thoracolumbar fascia."              "Bone –"                           "Clavicle:"  
0 голосов
/ 28 мая 2020

это работает для всех случаев, когда присутствует только один \

sub("(.*) (\\w+)/(\\w+) (.*)", "\\1 \\2 \\4; \\1 \\3 \\4", keyword[,1])

 [1] "deltoid muscle"                                                                                                                                        
 [2] "teres major muscle; teres minor muscle"                                                                                                                
 [3] "latissimus dorsi muscle"                                                                                                                               
 [4] "serratus anterior/posterior superior muscle; serratus anterior muscle; serratus anterior/posterior superior muscle; serratus posterior inferior muscle"
 [5] "levator scapulae"                                                                                                                                      
 [6] "rhomboid major muscle; rhomboid minor muscle"                                                                                                          
 [7] "erector spinae muscle"                                                                                                                                 
 [8] "thoracolumbar fascia."                                                                                                                                 
 [9] "Bone –"                                                                                                                                              
[10] "Clavicle:"

, мы можем использовать этот неудобный стек, чтобы получить случай, когда присутствуют 2 \

output <- sub("(.*) (\\w+)/(\\w+) (.*)", "\\1 \\2 \\4;\\1 \\3 \\4", keyword[,1])
output <- sub("(.*) (\\w+)/(\\w+) (.*)", "\\1 \\2 \\4;\\1 \\3 \\4", unlist(strsplit(output,";")))
output <- unlist(strsplit(output,";"))


    > output
 [1] "deltoid muscle"                     "teres major muscle"                
 [3] "teres minor muscle"                 "latissimus dorsi muscle"           
 [5] "serratus anterior superior muscle"  "serratus posterior superior muscle"
 [7] "serratus anterior inferior muscle"  "serratus posterior inferior muscle"
 [9] "levator scapulae"                   "rhomboid major muscle"             
[11] "rhomboid minor muscle"              "erector spinae muscle"             
[13] "thoracolumbar fascia."              "Bone –"                          
[15] "Clavicle:"                         
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...