>我有一个制表符分隔的文件abc.txt
contig score guide
1:100-101 7 AAA
1:100-101 6 BBB
1:100-101 5 CCC
1:100-101 4 DDD
1:100-101 3 EEE
1:100-101 2 FFF
1:100-101 1 GGG
1:100-101 90 HHH
1:100-101 111 III
1:100-101 1111 JJJ
1:200-203 503.5333333 KKK
1:200-203 570.7212121 LLL
1:200-203 637.9090909 MMM
1:200-203 705.0969697 NNN
1:200-203 772.2848485 OOO
1:200-203 839.4727273 PPP
1:200-203 906.6606061 QQQ
1:200-203 973.8484848 RRR
2:300-301 1041.036364 SSS
2:300-301 1108.224242 TTT
2:300-301 1175.412121 UUU
2:300-301 1242.6 VVV
2:300-301 1309.787879 ABC
2:300-301 1376.975758 CGA
2:300-301 1444.163636 ACD
第 1 列-重叠群有多个重复值,第二列有分数,第三列有对应于第 2 列分数的指导字母。我需要为第一列(重叠群(中的类似值选择前 5 名分数,并在那里打印相应的第 3 列值。
输出应如下所示,第一列具有唯一的列 1-Contig 条目,接下来的 10 行表示前 5 个分数和相应的第 3 列指导信
Score-1 Guide-1 Score-2 Guide-2 Score-3 Guide-3 Score-4 Guide-4 Score-5 Guide-5
1:100-101 1111 JJJ 111 III 90 HHH 7 AAA 6 BBB
1:200-203 973.8484848 RRR 906.6606061 QQQ 839.4727273 PPP 772.2848485 OOO 705.0969697 NNN
2:300-301 1444.163636 ACD 1376.975758 CGA 1309.787879 ABC 1242.6 VVV 1175.412121 UUU
我使用了"dplyr"和"desctools"软件包,但是我运行时出现一些错误。
library(dplyr)
library(DescTools)
file <- "abc.txt"
x=read.table(file)
b <- Large(x, k=5, unique = FALSE, na.last=NA)
并收到此错误
Error in Large(x, k = 5, unique = FALSE, na.last = NA) :
Not compatible with requested type: [type=character; target=double].
我被要求使用"sumproduct,large,iferror and vllokup"公式在excel中执行此操作,但是对于大型数据集,我想使用R提取文件。
任何帮助将不胜感激
问题是需要数字向量,而不是整个数据帧。这只是一个猜测,因为我没有可重现的示例,但您可能想按照以下思路做一些事情:
library(dplyr)
library(DescTools)
file <- "./abc.txt"
x=read.table(file)
colnames(x)<-c("contig","score","guide")
x<-x[-1,]
list <- split(x , f = x$contig )
columntitles<-c()
for (i in 1:5)
columntitles<-c(columntitles,paste0("guide-",i),paste0("score-",i))
x = data.frame(matrix(NA, nrow = 1, ncol = 10))
colnames(x)<-columntitles
for (i in 1:3){
singlerow<-c()
partialdata<-list[[i]]
partialdata<-partialdata%>% top_n(5, score)
partialdata<-partialdata[Rev(order(partialdata$score)),]
for (j in 1:5){
singlerow<-c(singlerow,toString(partialdata$guide[j]),toString(partialdata$score[j]))
}
x<-rbind(x,singlerow)
}
x<-x[-1,]
无需搜索解决此问题的软件包 - base R 拥有您需要的一切。
首先我们要处理分组运算,所以我们通过函数split()
根据组变量contig
分割数据框。我们得到一个数据框列表。为了将我们的操作应用于其中的每一个,我们可以使用 lapply()
,它将给定的函数应用于所有列表元素。我们构建了一个函数,该函数选择所提供数据框的前 5 行 x
,按score
排序(以 -x$score
降序排列(。我们将结果分配给z
。以下do.call(data.frame, split…)
结构仅将结果重塑为预期形式。
剩下的唯一事情是将列表打包到数据框并设置列名。
ll <- lapply(split(abc, abc$contig), function(x) {
z <- x[order(-x$score)[1:5], 2:3]
do.call(data.frame, split(z, 1:5))
})
ll # we're almost there …
$`1:100-101`
X1.score X1.guide X2.score X2.guide X3.score X3.guide X4.score X4.guide X5.score X5.guide
10 1111 JJJ 111 III 90 HHH 7 AAA 6 BBB
$`1:200-203`
X1.score X1.guide X2.score X2.guide X3.score X3.guide X4.score X4.guide X5.score X5.guide
18 973.8485 RRR 906.6606 QQQ 839.4727 PPP 772.2848 OOO 705.097 NNN
$`2:300-301`
X1.score X1.guide X2.score X2.guide X3.score X3.guide X4.score X4.guide X5.score X5.guide
25 1444.164 ACD 1376.976 CGA 1309.788 ABC 1242.6 VVV 1175.412 UUU
# … only pack the list to a data frame and set the columnnames
d.frm <- (do.call(rbind, ll))
colnames(d.frm) <- c(paste("Guide", 1:5), paste("Score", 1:5))[as.vector(t(matrix(1:10, nrow=5)))]
d.frm
Guide 1 Score 1 Guide 2 Score 2 Guide 3 Score 3 Guide 4 Score 4 Guide 5 Score 5
1:100-101 1111.0000 JJJ 111.0000 III 90.0000 HHH 7.0000 AAA 6.000 BBB
1:200-203 973.8485 RRR 906.6606 QQQ 839.4727 PPP 772.2848 OOO 705.097 NNN
2:300-301 1444.1636 ACD 1376.9758 CGA 1309.7879 ABC 1242.6000 VVV 1175.412 UUU