连接行中每个唯一值的列中的所有元素

时间:2017-10-12 18:11:28

标签: r shell unix

我想连接Sam_1中每个唯一值的所有fast1和fast2文件。

例如cat SRR3493476_1.fastq SRR3493477_1.fastq SRR3493475_1.fastq > L1-A_1.fastq

cat SRR3493476_2.fastq SRR3493477_2.fastq SRR3493475_2.fastq > L1-A_2.fastq

 Run_s           Sam_1   fast1                   fast2
    SRR3493476      L1-A    SRR3493476_1.fastq      SRR3493476_2.fastq
    SRR3493477      L1-A    SRR3493477_1.fastq      SRR3493477_2.fastq
    SRR3493475      L1-A    SRR3493475_1.fastq      SRR3493475_2.fastq
    SRR3493483      L1-B    SRR3493483_1.fastq      SRR3493483_2.fastq
    SRR3493481      L1-B    SRR3493481_1.fastq      SRR3493481_2.fastq
    SRR3493482      L1-B    SRR3493482_1.fastq      SRR3493482_2.fastq
    SRR3493487      L1-C    SRR3493487_1.fastq      SRR3493487_2.fastq
    SRR3493484      L1-C    SRR3493484_1.fastq      SRR3493484_2.fastq
    SRR3493485      L1-C    SRR3493485_1.fastq      SRR3493485_2.fastq
    SRR3493486      L1-D    SRR3493486_1.fastq      SRR3493486_2.fastq
    SRR3493478      L1-D    SRR3493478_1.fastq      SRR3493478_2.fastq
    SRR3493479      L1-D    SRR3493479_1.fastq      SRR3493479_2.fastq

3 个答案:

答案 0 :(得分:1)

您也可以使用tidyr + library(dplyr) library(tidyr) df %>% gather(variable, value, fast1:fast2) %>% mutate(variable = sub("(fast)(\\d)", "\\2.\\1q", variable)) %>% unite(Sam_1, c("Sam_1", "variable"), sep = "_") %>% group_by(Sam_1) %>% summarize(value = paste(value, collapse = " ")) %>% with(paste("cat", value, ">", Sam_1)) %>% sapply(system)

尝试此操作
[1] "cat SRR3493476_1.fastq SRR3493477_1.fastq SRR3493475_1.fastq > L1-A_1.fastq"
[2] "cat SRR3493476_2.fastq SRR3493477_2.fastq SRR3493475_2.fastq > L1-A_2.fastq"
[3] "cat SRR3493483_1.fastq SRR3493481_1.fastq SRR3493482_1.fastq > L1-B_1.fastq"
[4] "cat SRR3493483_2.fastq SRR3493481_2.fastq SRR3493482_2.fastq > L1-B_2.fastq"
[5] "cat SRR3493487_1.fastq SRR3493484_1.fastq SRR3493485_1.fastq > L1-C_1.fastq"
[6] "cat SRR3493487_2.fastq SRR3493484_2.fastq SRR3493485_2.fastq > L1-C_2.fastq"
[7] "cat SRR3493486_1.fastq SRR3493478_1.fastq SRR3493479_1.fastq > L1-D_1.fastq"
[8] "cat SRR3493486_2.fastq SRR3493478_2.fastq SRR3493479_2.fastq > L1-D_2.fastq"

<强>命令:

df = read.table(text = " Run_s           Sam_1   fast1                   fast2
                SRR3493476      L1-A    SRR3493476_1.fastq      SRR3493476_2.fastq
                SRR3493477      L1-A    SRR3493477_1.fastq      SRR3493477_2.fastq
                SRR3493475      L1-A    SRR3493475_1.fastq      SRR3493475_2.fastq
                SRR3493483      L1-B    SRR3493483_1.fastq      SRR3493483_2.fastq
                SRR3493481      L1-B    SRR3493481_1.fastq      SRR3493481_2.fastq
                SRR3493482      L1-B    SRR3493482_1.fastq      SRR3493482_2.fastq
                SRR3493487      L1-C    SRR3493487_1.fastq      SRR3493487_2.fastq
                SRR3493484      L1-C    SRR3493484_1.fastq      SRR3493484_2.fastq
                SRR3493485      L1-C    SRR3493485_1.fastq      SRR3493485_2.fastq
                SRR3493486      L1-D    SRR3493486_1.fastq      SRR3493486_2.fastq
                SRR3493478      L1-D    SRR3493478_1.fastq      SRR3493478_2.fastq
                SRR3493479      L1-D    SRR3493479_1.fastq      SRR3493479_2.fastq", header = TRUE, stringsAsFactors = FALSE)

数据:

{{1}}

答案 1 :(得分:1)

我会使用tapplypaste来生成命令:

r1 = with(dd, tapply(fast1, Sam_1, paste, collapse = " "))
for (i in seq_along(r1)) {
    r1[[i]] = sprintf("cat %s > %s.fastq", r1[[i]], names(r1)[i])
}
r1
#                                                                        L1-A 
# "cat SRR3493476_1.fastq SRR3493477_1.fastq SRR3493475_1.fastq > L1-A.fastq" 
#                                                                        L1-B 
# "cat SRR3493483_1.fastq SRR3493481_1.fastq SRR3493482_1.fastq > L1-B.fastq" 
#                                                                        L1-C 
# "cat SRR3493487_1.fastq SRR3493484_1.fastq SRR3493485_1.fastq > L1-C.fastq" 
#                                                                        L1-D 
# "cat SRR3493486_1.fastq SRR3493478_1.fastq SRR3493479_1.fastq > L1-D.fastq" 

然后,您可以使用for system循环来执行每个命令(lapply(r1, system))。

我会在fast2列中执行类似的步骤,或者将上面的内容转换成一个很好的函数来执行这两个操作,作为读者的练习。

使用此数据:

dd = read.table(text = " Run_s           Sam_1   fast1                   fast2
    SRR3493476      L1-A    SRR3493476_1.fastq      SRR3493476_2.fastq
    SRR3493477      L1-A    SRR3493477_1.fastq      SRR3493477_2.fastq
    SRR3493475      L1-A    SRR3493475_1.fastq      SRR3493475_2.fastq
    SRR3493483      L1-B    SRR3493483_1.fastq      SRR3493483_2.fastq
    SRR3493481      L1-B    SRR3493481_1.fastq      SRR3493481_2.fastq
    SRR3493482      L1-B    SRR3493482_1.fastq      SRR3493482_2.fastq
    SRR3493487      L1-C    SRR3493487_1.fastq      SRR3493487_2.fastq
    SRR3493484      L1-C    SRR3493484_1.fastq      SRR3493484_2.fastq
    SRR3493485      L1-C    SRR3493485_1.fastq      SRR3493485_2.fastq
    SRR3493486      L1-D    SRR3493486_1.fastq      SRR3493486_2.fastq
    SRR3493478      L1-D    SRR3493478_1.fastq      SRR3493478_2.fastq
    SRR3493479      L1-D    SRR3493479_1.fastq      SRR3493479_2.fastq", header = T)

答案 2 :(得分:1)

你可以像这样做一切

data <- read.table(text="Run_s           Sam_1   fast1                   fast2
    SRR3493476      L1-A    SRR3493476_1.fastq      SRR3493476_2.fastq
    SRR3493477      L1-A    SRR3493477_1.fastq      SRR3493477_2.fastq
    SRR3493475      L1-A    SRR3493475_1.fastq      SRR3493475_2.fastq
    SRR3493483      L1-B    SRR3493483_1.fastq      SRR3493483_2.fastq
    SRR3493481      L1-B    SRR3493481_1.fastq      SRR3493481_2.fastq
    SRR3493482      L1-B    SRR3493482_1.fastq      SRR3493482_2.fastq
    SRR3493487      L1-C    SRR3493487_1.fastq      SRR3493487_2.fastq
    SRR3493484      L1-C    SRR3493484_1.fastq      SRR3493484_2.fastq
    SRR3493485      L1-C    SRR3493485_1.fastq      SRR3493485_2.fastq
    SRR3493486      L1-D    SRR3493486_1.fastq      SRR3493486_2.fastq
    SRR3493478      L1-D    SRR3493478_1.fastq      SRR3493478_2.fastq
    SRR3493479      L1-D    SRR3493479_1.fastq      SRR3493479_2.fastq", 
    header=TRUE, stringsAsFactors=FALSE)


groups1 <- by(data$fast1, data$Sam_1, as.character)
groups2 <- by(data$fast2, data$Sam_1, as.character)

groups <- c(groups1, groups2)
fnames <- paste0(names(groups), "_", rep(1:2, each=length(unique(data$Sam_1))))
names(groups) <- fnames


for (i in 1:length(groups)) {
    file <- shQuote(paste0(fnames[i], ".fastq"))
    system(paste("cat", paste(groups[[i]], collapse=" "), ">", file))
}

文件名将为L1-A_1.fastqL1-B_1.fastq等。