我有这个数据:
data <- data.frame(INFO=c(
"IMPUTED;FREQ=TOPMED:1,4.534e-05|dbGaP_PopFreq:0.9998,0.0001686;GENEINFO=LOC105372733:105372733;GNO;INT;R3;RS=1216947677;SSR=0;VC=INDEL;dbSNPBuildID=151",
"IMPUTED;FREQ=GnomAD:0.9999,8.488e-05|TOPMED:1,2.267e-05|dbGaP_PopFreq:1,0;GENEINFO=LOC105372733:105372733;GNO;INT;R3;RS=1415762563;SSR=0;VC=INDEL;dbSNPBuildID=151",
"IMPUTED;FREQ=TOPMED:1,3.778e-06|dbGaP_PopFreq:1,0;GENEINFO=LOC105372733:105372733;GNO;INT;R3;RS=1237792419;SSR=0;VC=DEL;dbSNPBuildID=155"
)
)
字符串
我想在delimiter '上拆分INFO
列;在这些字段中,有以'='分隔的键/值对,我希望键是新列的名称,值是行的元素。如果没有值(例如键“IMPUTED”),我希望值为空字符串。
就像这样
data_new <- data.frame(IMPUTED=c('', '', ''),
FREQ=c('TOPMED:1,4.534e-05|dbGaP_PopFreq:0.9998,0.0001686',
'GnomAD:0.9999,8.488e-05|TOPMED:1,2.267e-05|dbGaP_PopFreq:1,0',
'TOPMED:1,3.778e-06|dbGaP_PopFreq:1,0'))
型
我被困在这里,我不总是知道键名,我有数百万行要做这件事,所以我宁愿不使用任何循环
我试过这个
library(stringr)
library(tidyr)
library(dplyr)
KVsep <- fixed(";") #key-value separator
Vsep <- fixed("=") #value separator
newDF <- data %>%
mutate(KVpairs = str_split(INFO, KVsep)) %>%
unnest(KVpairs) %>%
separate(KVpairs, into = c("key", "value"), Vsep) %>%
spread(key, value) %>%
select(-INFO)
型
从here,但得到
Error in `check_not_stringr_pattern()`:
! `sep` can't use modifiers from stringr.
型
3条答案
按热度按时间irlmq6kh1#
使用
pivot_wider
构造所需的键值宽格式的方法字符串
ecfsfe2w2#
一个比较普通的方法是:
字符串
创建于2023-07-21使用reprex v2.0.2
lp0sw83n3#
管道的第一行试图在第二步中创建一个列表列(
str_split
将返回一个列表),但data.frame
不会创建这样的列表列。如果你想使用tidyverse工作流,我建议作为第一步,制作一个tibble
的数据框,它将按照预期接受列表列:现在我们有一个列表列,我们可以
unnest
。我将在这里添加一个唯一的ìd
,以便我们可以跟踪原始观察结果:为了到达最后一列,我们可以使用
pivot_wider
(spread
已经被这个函数取代),但是首先最好注意不正确的键值对(例如:IMPUTED
)。由于所需的输出是这些列的''
值,因此在没有=
时追加=
将完成这项工作:我们还需要在它们各自的列中获取键和值,为此我们可以使用
separate_delim_wider
,它已经取代了separate
:最后
pivot_wider
:希望这个能帮上忙。请注意,我在这里假设
IMPUTED
,GNO
等将始终存在并具有唯一值。如果不是这种情况,那么输出将很难预测。