R多个文件"分割和绘图"

时间:2012-07-09 15:02:32

标签: r plot split r-factor

我有不同的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    

因此,因素包括AAABBBCCCDDDEEE。我需要为每个文件绘制这些因子的每列的平均值。

感谢您的支持。

2 个答案:

答案 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.

这给你以下内容:

enter image description here

更新

在再次阅读您的问题之后,我认为我误解了您想要如何进行分组。以下使用apply按行而不是列进行绘制。

par(mfrow=c(2, 3)) # Just for demonstration 
apply(temp[-1], 1, barplot)
dev.off() # Reset the graphics device

enter image description here

更新[回答评论中的一些问题]

如果你想结合一些因素,我建议在分割之前创建一个新的因子变量。因此,例如,如果您想要分为“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)