как объединить список с таблицей данных при сохранении формата списка в качестве вывода - PullRequest
0 голосов
/ 31 января 2020

У меня есть список, содержащий вектор в качестве его элементов в R

Пример:


## -- reference data
tr_data <- data.table(code = c("S00000170","K00000178","S00000164","S00000167"), name = c("A","B","C","D"))

## -- mylist to join a reference
data <- c("S00000170,K00000178,S00000164","K00000178,S00000167")
mylist <- str_split(data, ',')
mylist

# [[1]]
# [1] "S00000170" "K00000178" "S00000164"
# 
# [[2]]
# [1] "K00000178" "S00000167"

Я хотел бы объединить mylist и tr_data и сохранить формат списка

## -- my output
mylist_name

# [[1]]
# [1] "A" "B" "C"
# 
# [[2]]
# [1] "B" "D"

Я знаю, что мог бы использовать для l oop, но есть ли лучший и более быстрый способ сделать это?

Ответы [ 2 ]

1 голос
/ 31 января 2020

Вы можете использовать match, т.е.

lapply(mylist, function(i)tr_data$name[match(i, tr_data$code)])

#[[1]]
#[1] "A" "B" "C"

#[[2]]
#[1] "B" "D"
0 голосов
/ 31 января 2020

Другой вариант - преобразовать data в data.table, установить ключ / индекс и выполнить объединение

DT <- data.table(code=unlist(l <- stri_split_fixed(data, ',')), 
    g=rep(seq_along(l), lengths(l)))

setindex(DT, code)
setkey(tr_data, code)
tr_data[DT, on=.(code)][, 
    .(.(name)) , g]$V1

или

setindex(DT, code)
setkey(tr_data, code)
DT[tr_data, on=.(code), name := name][,
    .(.(name)), g]$V1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...