我偶然发现了R中的一个问题,我希望有人可以清理它为什么会发生以及如何解决它。我在使用R时没有得到很好的审查,有时会因为一行代码通常比许多其他语言做得更多而变得混乱。问题似乎是程序在第一次之后没有正确地获取文件输入。如果我输入一个文件,直方图会以我期望的方式出现。但不幸的是,当输入多个文件时,它会将它们组合在一起并在第一个文件旁边进行消隐。我宁愿每个输入文件都有自己的独立直方图。很抱歉很长的帖子,但我想尽可能多的信息,以使我的代码可重现(我似乎很难重现代码)。
代码是这样的:
library("tcltk")
#choose any number of files
File.names<-(tk_choose.files(default="", caption="Choose your files", multi=TRUE, filters=NULL, index=1))
Num.Files<-NROW(File.names)
#read the tables
dat <- lapply(File.names,read.table,header = TRUE)
names(dat) <- paste("f", 1:length(Num.Files), sep="")
#use the 14th columns data
tmp <- stack(lapply(dat,function(x) x[,14]))
#this is where the histogram is made(with percent shown on the y axis)
require(ggplot2)
ggplot(tmp,aes(x = values)) +
facet_wrap(~ind) +
geom_histogram(aes(y=..count../sum(..count..)))
dput(tmp)
dput(dat)
sessionInfo()
以下是用户可以选择的文件示例:
Targ cov av_cov 87A_cvg 87Ag 87Agr 87Agr 87A_gra 87A%_1 87A%_3 87A%_5 87A%_10 87A%_20 87A%_30 87A%_40 87A%_50 87A%_75 87A%_100
1:028 400 0.42 400 0.42 1 1 2 41.8 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
1:296 400 0.42 400 0.42 1 1 2 41.8 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
1:453 1646 8.11 1646 8.11 7 8 13 100.0 100.0 87.2 32.0 0.0 0.0 0.0 0.0 0.0 0.0
1:427 1646 8.11 1646 8.11 7 8 13 100.0 100.0 87.2 32.0 0.0 0.0 0.0 0.0 0.0 0.0
1:736 5105 29.68 5105 29.68 14 29 48 100.0 100.0 100.0 86.0 65.7 49.4 35.5 16.9 0.0 0.0
1:514 5105 29.68 5105 29.68 14 29 48 100.0 100.0 100.0 86.0 65.7 49.4 35.5 16.9 0.0 0.0
1:296 5105 29.68 5105 29.68 14 29 48 100.0 100.0 100.0 86.0 65.7 49.4 35.5 16.9 0.0 0.0
1:534 400 0.42 400 0.42 1 1 2 41.8 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
另一个:
Targ cov av_cov 87A_cvg 87Ag 87Agr 87Agr 87A_gra 87A%_1 87A%_3 87A%_5 87A%_10 87A%_20 87A%_30 87A%_40 87A%_50 87A%_75 87A%_100
1:028 400 0.42 400 0.42 1 1 2 41.8 0.0 1.0 0.0 20.0 0.0 0.0 0.0 0.0 0.0
1:296 400 0.42 400 0.42 1 1 2 41.8 0.0 20.0 0.0 40.0 0.0 100.0 10.0 50.0 4.0
1:453 1646 8.11 1646 8.11 7 8 13 100.0 100.0 87.2 32.0 0.0 100.0 4.0 60.0 30.0 20.0
1:427 1646 8.11 1646 8.11 7 8 13 100.0 100.0 87.2 32.0 0.0 80.0 40.0 60.0 80.0 90.0
1:736 5105 29.68 5105 29.68 14 29 48 100.0 100.0 100.0 86.0 65.7 49.4 35.5 16.9 30.0 20.0
1:514 5105 29.68 5105 29.68 14 29 48 100.0 100.0 100.0 86.0 65.7 49.4 35.5 16.9 20.0 30.0
1:296 5105 29.68 5105 29.68 14 29 48 100.0 100.0 100.0 86.0 65.7 49.4 35.5 16.9 20.0 30.0
1:534 400 0.42 400 0.42 1 1 2 41.8 0.0 40.0 30.0 80.0 70.0 40.0 30.0 30.0 10.0
代码适用于一个文件(这些直方图来自不同的输入文件,但是你得到的图片)但是不同意多个文件(不管数字): 一:
这就是我希望所有直方图看起来的方式,每个输入文件一个。可惜... 多个文件:
> dput(tmp)
structure(list(values = c(0, 0, 0, 0, 49.4, 49.4, 49.4, 0), ind = structure(c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "f1", class = "factor")), .Names = c("values",
"ind"), row.names = c(NA, -8L), class = "data.frame")
> dput(dat)
structure(list(f1 = structure(list(Targ = structure(c(1L, 2L,
4L, 3L, 7L, 5L, 2L, 6L), .Label = c("1:028", "1:296", "1:427",
"1:453", "1:514", "1:534", "1:736"), class = "factor"), cov = c(400L,
400L, 1646L, 1646L, 5105L, 5105L, 5105L, 400L), av_cov = c(0.42,
0.42, 8.11, 8.11, 29.68, 29.68, 29.68, 0.42), "X87A_cvg", "X87Ag", "X87Agr", "X87Agr.1", "X87A_gra", "X87A._1", "X87A._3", "X87A._5", "X87A._10", "X87A._20", "X87A._30", "X87A._40",
"X87A._50", "X87A._75", "X87A._100"), class = "data.frame", row.names = c(NA,
-8L))), .Names = "f1")
> sessionInfo()
R version 2.14.1 (2011-12-22)
Platform: x86_64-redhat-linux-gnu (64-bit)
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=C LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] tcltk stats graphics grDevices utils datasets methods
[8] base
other attached packages:
[1] ggplot2_0.9.1
loaded via a namespace (and not attached):
[1] colorspace_1.1-1 dichromat_1.2-4 digest_0.5.2 grid_2.14.1
[5] labeling_0.1 MASS_7.3-17 memoise_0.1 munsell_0.3
[9] plyr_1.7.1 proto_0.3-9.2 RColorBrewer_1.0-5 reshape2_1.2.1
[13] scales_0.2.1 stringr_0.6
有没有办法让每个直方图分开,能够独自站立? 提前致谢 斯蒂芬
答案 0 :(得分:4)
鉴于你的dat
在我的系统上为dat
返回了一个损坏的数据帧,这里有一个更简单的方法,使用基数R和虚拟数据。
## fake a list of data frames, here, 4, each with two columns
dat <- list(file1 = data.frame(X = runif(20), Y = rnorm(20)),
file2 = data.frame(X = runif(20), Y = runif(20)),
file3 = data.frame(X = runif(20),
Y = rnorm(20) + rnorm(20, mean = 2, sd = 2)),
file4 = data.frame(X = runif(20), Y = rnorm(20, mean = 4)))
## extract the second column from each
## (this is the same as your code extracting the 14 column)
tmp <- lapply(dat, `[[`, 2)
现在看看我们有什么:
R> str(tmp)
List of 4
$ file1: num [1:20] -1.0225 -0.0302 -0.0987 1.977 0.2579 ...
$ file2: num [1:20] 0.84583 0.49525 0.12287 0.43929 0.00132 ...
$ file3: num [1:20] 2.03 5.27 1.57 2.72 1.12 ...
$ file4: num [1:20] 4.54 4.08 4.28 4.48 6.36 ...
因此,请尝试绘制tmp
的第一个组成部分:
hist(tmp[[1]])
好的,这样才行。现在我们知道我们可以绘制所有组件。以下是一些方法:
layout(matrix(1:4, ncol = 2))
for(p in seq_along(tmp)) {
hist(tmp[[p]])
}
layout(1)
或使用lapply()
为我们执行循环
layout(matrix(1:4, ncol = 2))
lapply(tmp, function(x) {hist(x); invisible()})
layout(1)
两者都产生如下:
显然,我们可以更好地定制情节轴标签和标题,但我将其留作读者的练习。
答案 1 :(得分:0)
这是因为您使用的是facet_wrap()
。如果您希望每个输入有一个绘图,那么您必须进行循环
library("tcltk")
#choose any number of files
File.names<-(tk_choose.files(default="", caption="Choose your files", multi=TRUE, filters=NULL, index=1))
Num.Files<-NROW(File.names)
#read the tables
dat <- lapply(File.names,read.table,header = TRUE)
names(dat) <- paste("f", 1:length(Num.Files), sep="")
#use the 14th columns data
tmp <- stack(lapply(dat,function(x) x[,14]))
#this is where the histogram is made(with percent shown on the y axis)
gHist <- function(df){
require(ggplot2)
# New page so it doesn't overplot previous graphs
grid.newpage()
ggplot(df,aes(x = values)) +
geom_histogram(aes(y=..count../sum(..count..)))+
# Add a tible
opts(title = unique(df$ind))
}
# Split gives a list of the data.frame splited by ind
# Then lapply will cycle through the list and
# apply the function to each piece
lapply(split(tmp, tmp$ind), gHist)
你只提供了一个情节的数据,所以我只做了一个。 R抱怨dput(dat)
已被破坏。