当我在某行中获取值时,我想在数据框中选择特定的行。这些选定行(加上初始选定行)必须组成新数据帧,并且数据框名称必须在初始选定行中为= $Name
。
逻辑:
1 - 初始选定的行必须$FC
=> 0.7。
2 - 形成数据框的选定行必须$chr
=到初始选定行。
3 - 所选行在5000窗口内必须有$Position
(与初始选定行中的$Position
比较)。
* 3a)在此示例中,行$Name
= BD22无法包含在BD13
数据框中,因为$Position
超出了窗口编号(自{{1 }} = 500直到$Position
= 5500)
以上是一个简化的例子:
我的输入$Position
数据框:
input
我希望有一个名称行作为输出的数据框,在本例中为 Name FC chr Position
BD10 0.1 chr1 1000
BD11 0.1 chr2 1000
BD12 0.2 chr3 2000
BD13 0.7 chr3 3000
BD14 0.4 chr3 4000
BD22 0.1 chr3 7000
BD23 0.2 chr4 1000
:
BD13
之后,我想绘制每个组合数据帧:
Name FC chr Position
BD12 0.2 chr3 2000
BD13 0.7 chr3 3000
BD14 0.4 chr3 4000
我试过了:
pdf(BD13.pdf)
plot(BD13$Name, BD13$FC, main="BD13",
xlab="Name", ylab="FC")
dev.off()
但是out <- subset(input, FC >= 0.7)
out$startw <- (out$Position - 2500)
out$endw <- (out$Position + 2500)
library(plyr)
lvl <- dlply(out, .(Name))
for (i in 1:length(lvl)) {
Neigh1 <- subset(input, input$Position >= lvl[i]$startw & lvl[i]$chr == input$chr)
Neigh2 <- subset(input, input$Position <= lvl[i]$endw & lvl[i]$chr == input$chr)
Neight <- rbind(Neigh1, Neigh2)
pdf(sprintf("%s.pdf", [i]))
boxplot(Neigh$Name, Neigh$FC, xlab=[i], ylab="FC", main="[i]")
dev.off()}
和Neigh1
是空的......
谢谢!
答案 0 :(得分:1)
除非你真的想要,否则根据input$name
中的元素创建所有这些新的变量是一个坏主意,因为:
如果input$name
包含与之相冲突的名称,例如“输入”
另一个变量,你可以得到很难追查的错误
您可能会使用许多变量使工作区混乱
很难(呃)循环变量来绘制它们而不使用深奥的R代码,或复制和粘贴大量代码。
我建议按如下方式创建一个列表:
rows <- 1:nrow(input)
res <- lapply(which(input$FC>=0.7),function(x) {
x2 <- rows
x2<- input$chr[x2] == input$chr[x] & abs(input$Position[x2] - input$Position[x]) < 2500
input[x2,]})
names(res) <- input$Name[input$FC>=0.7] ##corrected this line
其中列表的每个元素都是您要创建的变量之一。访问为res[["BD13"]]
或res[[1]]
- 后一种形式可以轻松地在循环中生成所有绘图。
为了绘图,我认为您需要以下内容(目前无法测试):
for (i in 1:length(res)) {
pdf(sprintf("%s.pdf", names(res)[i]))
boxplot(res[[i]]$Name, res[[i]]$FC, xlab=res[[i]]$Name, ylab="FC", main=names(res)[i])
dev.off()
}
但检查boxplot的参数 - 我不认为第一个应该是文本
res[i]
是一个包含i
res
元素的列表(长度为1),而res[[i]]
是i
元素本身。< / p>