мои данные выглядят так:
V1 V2 V3 V4 V5 V6 V7
1: chr11 9554978 9554979 rs114731977 0 + ENSG00000133789
2: chr11 9554978 9554979 rs374765884 0 + ENSG00000133789
3: chr11 9554977 9554979 rs796467675 0 + ENSG00000133789
4: chr11 9554976 9554979 rs796841057 0 + ENSG00000133789
5: chrX 15148554 15148555 rs2317411 0 - ENSG00000130150
6: chrX 15148775 15148776 rs2317410 0 - ENSG00000130150
...
я хочу получить (скажем, для этого примера) два файла, каждый из которых содержит набор значений rs из $ V4 для уникального значения в $ V7
нравится:
ENSG00000133789.txt:
rs114731977
rs374765884
rs796467675
rs796841057
ENSG00000130150.txt:
rs2317411
rs2317410
некоторые вещи, которые я пытался получить эти значения:
data%>%group_by(V7) %>% summarise()
distinct_df = data %>% distinct(V7) %>% select(V7)
и они возвращают мне только столбец за 7 долларов
Я тоже пробовал это:
awk -F' ' 'FNR==NR{a[$7]++;next} a[$7]==1' SG_ALL SG_ALL >ss
SG_ALL - это место, где находятся данные, входной файл, 2 раза я читаю в первый раз, он берет количество строк и сохраняет их в массиве, а второй раз выполняет условие, если счетчик равен 1, он должен печатать строку только тогда
Но на выходе я получаю только одну строку:
chr13 41545705 41545706 rs12429969 0 + ENSG00000150907





это решило мою проблему:
awk -F '' '{f = $ 7 ".txt"; print $ 4 >> f; закрыть (f)} 'OFS =' 'SG_ALL
Вот вариант использования tidyverse:
library(tidyverse)
# Generate a data frame containing V4 and V7
df <- data.frame(
V4 = paste0(
'rs',
str_pad(
sample(1:10e6, 3),
width = 6,
side = 'left',
pad = '0'
)
),
V7 = rep(
paste0(
'ENSG',
str_pad(
sample(1:5000, 4),
width = 10,
side = 'left',
pad = '0'
)
),
12
)
)
# Generate unique V7
unique_V7 <- df %>% select(
V7
) %>% unique() %>% pull()
# Write V4 for each (unique) V7
for (cur_V7 in unique_V7) {
df %>% filter(
V7 == cur_V7
) %>% select(
V4
) %>% write_csv(
path = paste0(
cur_V7, '.txt' # filename
),
col_names = FALSE
)
}