Мне нужно разделить столбец, содержащий информацию, на несколько столбцов.
Я бы использовал, tstrsplit
но информация такого же рода не в том же порядке среди строк, и мне нужно извлечь имя нового столбца в переменной. Важно знать: может быть много информации (поля, которые станут новыми переменными), и я не знаю всех из них, поэтому я не хочу решения «поле за полем».
Ниже приведен пример того, что у меня есть:
library(data.table)
myDT <- structure(list(chr = c("chr1", "chr2", "chr4"), pos = c(123L,
435L, 120L), info = c("type=3;end=4", "end=6", "end=5;pos=TRUE;type=2"
)), class = c("data.table", "data.frame"), row.names = c(NA,-3L))
# chr pos info
#1: chr1 123 type=3;end=4
#2: chr2 435 end=6
#3: chr4 120 end=5;pos=TRUE;type=2
И я хотел бы получить:
# chr pos end pos type
#1: chr1 123 4 <NA> 3
#2: chr2 435 6 <NA> <NA>
#3: chr4 120 5 TRUE 2
Самый простой способ получить это будет высоко ценится! ( Примечание: я не хочу идти по пути dplyr / tidyr )
r
data.table
reshape
Cath
источник
источник
structure()
я обновил ответ, чтобы избежать этой проблемы) (2) Это специально предназначенные символы ... Я чувствовал, что их правильный анализ будет трудным и отдельный вопрос. Похоже, вы решили это, хотя в своем ответе я посмотрю и посмотрю, смогу ли я узнать что-то новое.Я предполагаю, что ваши данные поступают из файла VCF , если так, есть специальный инструмент для таких проблем - bcftools .
Давайте создадим пример файла VCF для тестирования:
Теперь мы можем использовать bcftools . Вот в качестве примера, мы устанавливаем AF и DP из столбца INFO :
Смотрите руководство для более подробной информации .
источник
Мы могли бы разделить,
";"
затем изменить форму от ширины к длине, затем снова разделить, а затем снова"="
изменить форму к длине:Улучшенная / более читаемая версия:
источник
На данный момент мне удалось получить то, что я хочу, с помощью следующего кода:
Два варианта улучшения строк выше, благодаря @ A5C1D2H2I1M1N2O1R2T1 (который дал их в комментариях):
, с двойным
cSplit
доdcast
:, с
cSplit
/trstrplit
иdcast
вместоreshape
:источник
cSplit
, как это:cSplit(cSplit(myDT, "info", ";", "long"), "info", "=")[, dcast(.SD, chr + pos ~ info_1, value.var = "info_2")]
.cSplit
затемtstrsplit
, после чегоdcast
:cSplit(myDT, "info", ";", "long")[, c("t1", "t2") := tstrsplit(info, "=", fixed = TRUE)][, dcast(.SD, chr + pos ~ t1, value.var = "t2")]
.cSplit
опции :-)Вот как я это сделаю:
Создано в 2019-11-29 пакетом представлением (v0.3.0)
источник
eval(parse(text=...))
... но, тем не менее, спасибо за ваш ответparse
у меня плохая репутация, потому что она часто используется по неправильной причине, вот как раз тот случай, когда она подходит, переходя от строки к коду. Вы отформатировали текст, но не отформатировали для R, и у вас есть именованные списки, поэтому моя первая строка делает его кодом для списка R, заменяя «a; b» на «list (a, b)». Затем мы оцениваем это и составляем из него таблицу.Вы можете использовать отдельные вызовы
sub
для каждого желаемого извлеченного поля, например, дляtype
:источник