2013-02-21 75 views
2

我是R的新手,在计算方法之前努力将多个因素组合在一起。这个问题很复杂,因为我正在对数百个需要分组的因素有不同级别的文件进行这项工作。我从之前的文章中看到如何使用levels()来解决单个级别的这个分组问题,但是我的数据对于这种方法太可变。R:在多个文件中对因素进行分组

基本上,我想计算一个因子的多个水平,然后是一个整体平均值。例如,我想计算Status列中每个物种的平均值:Crypt1,Crypt2,Crypt3,Native,Intro,然后也是Crypt物种的总平均值(包括Crypt1,Crypt2,和Crypt3,但不是Native或Intro)。然而,一个物种要么具有多级Crypt(变量,直到Crypt8),要么具有Native和Intro,并且在这些级别中的每个物种的所有物种的最终平均值最终被平均到相同的汇总表中。

例如:

Species Status Value 
A  Crypt1 5 
A  Crypt1 6 
A  Crypt2 4 
A  Crypt2 8 
A  Crypt3 10 
A  Crypt3 50 
B  Native 2 
B  Native 9 
B  Intro  9 
B  Intro  10 

我在想,我可以用每个因素的第一个字母地穴因素的共同作用组,但我很努力的目标的第一个字母,因为他们的因素,而不是字符串,我不知道如何在它们之间进行转换。我最终计算使用聚合()的手段,我可​​以得到每个因素的个别手段,但不是分组因素。 任何想法将不胜感激,谢谢!

回答

2

对于个人手段:

# assuming your data is in data.frame = df 
require(plyr) 
df.1 <- ddply(df, .(Species, Status), summarise, ind.m.Value = mean(Value)) 

> df.1 
# Species Status ind.m.Value 
# 1  A Crypt1  5.5 
# 2  A Crypt2  6.0 
# 3  A Crypt3 30.0 
# 4  B Intro  9.5 
# 5  B Native  5.5 

对于整体平均值,这个想法是去除存在于每个条目的Status使用sub/gsub年底的数字。

df.1$Status2 <- gsub("[0-9]+$", "", df.1$Status) 
df.2 <- ddply(df.1, .(Species, Status2), summarise, oall.m.Value = mean(ind.m.Value)) 

> df.2 
# Species Status2 oall.m.Value 
# 1  A Crypt  13.83333 
# 2  B Intro  9.50000 
# 3  B Native  5.50000 

这是你所期待的吗?

+0

是的,完美的;感谢堆! – user2096647 2013-02-22 21:38:14

0

这是另一种选择。从概念上讲,它与Arun的答案相同,但是它坚持以R为基础的函数,并以某种方式保持工作空间和原始数据的整洁。

我假设我们以名为“temp”的data.frame开始,并且我们要为个别和分组方式创建两个新的data.frame s,“T1”和“T2”。我们使用<<-with内的结果分配给全球环境

# Verify that you don't have T1 and T2 in your workspace 
ls(pattern = "T[1|2]") 
# character(0) 

# Use `with` to generate T1 (individual means) 
# and to generate T2 (group means) 
with(temp, { 
    T1 <<- aggregate(Value ~ Species + Status, temp, mean) 
    temp$Status <- gsub("\\d+$", "", Status) 
    T2 <<- aggregate(Value ~ Species + Status, temp, mean) 
}) 

# Now they're there! 
ls(pattern = "T[1|2]") 
# [1] "T1" "T2" 

通知。不是每个人都喜欢使用它,但我认为在这种情况下可以。这是“T1”和“T2”的样子。

T1 
# Species Status Value 
# 1  A Crypt1 5.5 
# 2  A Crypt2 6.0 
# 3  A Crypt3 30.0 
# 4  B Intro 9.5 
# 5  B Native 5.5 

T2 
# Species Status Value 
# 1  A Crypt 13.83333 
# 2  B Intro 9.50000 
# 3  B Native 5.50000 

回首with命令,它可能已经好像我们已经改变了“状态”列的值。但是,这只是在使用with创建的环境中。您的原始data.frame与您开始时的相同。

temp 
# Species Status Value 
# 1  A Crypt1  5 
# 2  A Crypt1  6 
# 3  A Crypt2  4 
# 4  A Crypt2  8 
# 5  A Crypt3 10 
# 6  A Crypt3 50 
# 7  B Native  2 
# 8  B Native  9 
# 9  B Intro  9 
# 10  B Intro 10