我是R的新手,在计算手段之前努力将多个级别的因子分组。由于我在数百个具有可变级别因素需要分组的文件中执行此操作,因此这个问题变得复杂。我在之前的帖子中看到如何使用levels()解决单个级别的分组问题,但我的数据对于此方法来说变化太大。
基本上,我想计算一个因子的多个级别的个体和总体平均值。例如,我想计算列状态:Crypt1,Crypt2,Crypt3,Native,Intro,以及Crypt物种的整体平均值(包括Crypt1,Crypt2,和Crypt3,但不是Native或Intro)。然而,一个物种要么具有多个级别的地穴(可变,高达Crypt8),要么具有原生和简介,并且每个等级的所有物种的平均值最终被平均到相同的摘要表中。
例如:
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
我在想我可以使用每个因素的第一个字母将Crypt因子组合在一起,但我很难瞄准第一个字母,因为它们是因素,而不是字符串,我不确定如何在它们之间进行转换。我最终使用aggregate()来计算均值,我可以为每个因子获得单独的均值,但不能用于分组因子。 任何想法都将非常感谢,谢谢!
答案 0 :(得分: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
这是你期待的吗?
答案 1 :(得分:0)
这是另一种选择。从概念上讲,它与Arun的答案相同,但它坚持基础R中的功能,并且在某种程度上,使您的工作空间和原始数据保持一定的整洁。
我假设我们从名为“temp”的data.frame
开始,我们想要为个人和分组方法创建两个新的data.frame
s,“T1”和“T2”。
# 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"
请注意,我们使用<<-
将with
内的结果分配给全局环境。不是每个人都喜欢使用它,但我认为在这种特殊情况下它是可以的。这是“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