我有不同的csv文件,我正在读这样的文件:
files <- list.files("D:/...", pattern = "L01")
for (x in files) {
(assign(x, read.csv(x, head=TRUE,, sep=",", skip= 92)))
}
接下来我想要实现的是根据名为“Case”的列拆分(分配因子)文件,并为每个“Case”绘制条形图中剩余列的所有平均值。所以最后如果我有2个文件,50个因子和26个列我将获得100个绘图,其中26个吧。
所以我需要为每个文件提供类似的东西,
Cases <- factor(x$Cases)
但是对于每个文件,然后每个因子1个图表,26 bar。
希望这很清楚。
感谢您的任何建议。
E.g。对于我有的每个文件
AAA col1 col2 col3 ....
AAA
BBB
BBB
CCC
CCC
DDD
DDD
EEE
EEE
AAA
AAA
BBB
BBB
CCC
CCC
DDD
DDD
EEE
EEE
因此,因素包括AAA
,BBB
,CCC
,DDD
,EEE
。我需要为每个文件绘制这些因子的每列的平均值。
感谢您的支持。
答案 0 :(得分:1)
假设您已经正确设置了数据框,那么使用aggregate
(或plyr包中的ddply
)怎么样?这是一个带有一个这样的数据框的玩具示例(您需要将其嵌入循环或编写自定义函数)。
L01_001 <- data.frame(Cases=gl(5, 2, 5*2*2, labels=c("AAA","BBB","CCC","DDD","EEE")),
replicate(3, rnorm(5*2*2)))
mean.by.case <- with(L01_001, aggregate(L01_001[,-1], list(Cases=Cases), mean))
## opar <- par(mfrow=c(nlevels(L01_001$Cases), 1))
## apply(mean.by.case[,-1], 1, function(x) barplot(x))
## par(opar)
library(lattice)
barchart(~ X1 + X2 + X3 | Cases, mean.by.case)
我不建议使用条形图来显示您的数据:它们在显示数据的细微变化并且表现不佳时会非常糟糕data-ink ratio。在我看来,克利夫兰的点图或水平图将完成这项工作。在后一种情况下,您甚至可以在一个页面上表示所有内容,这看起来像是一个非常好的替代“100个情节,其中包含26个条形图。”
答案 1 :(得分:1)
你的问题措辞不是很清楚,但这样的事情可能会让你开始:
# First, some sample data
set.seed(1)
df = data.frame(Cases = sample(LETTERS[1:5], 20, replace=TRUE),
Set1 = sample(4:10, 20, replace=TRUE),
Set2 = sample(6:19, 20, replace=TRUE),
Set3 = sample(1:20, 20, replace=TRUE),
Set4 = sample(5:16, 20, replace=TRUE))
# Use aggregate to find means by group
temp = aggregate(df[-1], by=list(df$Cases), mean)
# Plot
# par(mfrow=c(2, 2)) # Just for demonstration; used for the attached image
lapply(temp[-1], barplot, names.arg = temp$Group.1)
dev.off() # Reset the graphics device if you've changed par.
这给你以下内容:
在再次阅读您的问题之后,我认为我误解了您想要如何进行分组。以下使用apply
按行而不是列进行绘制。
par(mfrow=c(2, 3)) # Just for demonstration
apply(temp[-1], 1, barplot)
dev.off() # Reset the graphics device
如果你想结合一些因素,我建议在分割之前创建一个新的因子变量。因此,例如,如果您想要分为“A + B”,“C”,“D”和“E”(四组而不是五组),您可以执行以下操作:
# Create a new factor variable
df$Cases_2 = df$Cases # So you don't overwrite your original data
levels(df$Cases_2) <- ifelse(levels(df$Cases_2) %in% c("A","B"),
"AB", levels(df$Cases_2))
# Proceed almost as before
temp = aggregate(df[-c(1, 6)], by=list(df$Cases_2), mean)
apply(temp[-1], 1, barplot)