R: Группировка уровней фактора по нескольким файлам
Я новичок в 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
Я думал, что мог бы использовать первую букву каждого фактора, чтобы сгруппировать факторы Crypt вместе, но я изо всех сил стараюсь нацелиться на первую букву, потому что это факторы, а не строки, и я не уверен, как преобразовать между ними. В конечном итоге я рассчитываю средние значения с использованием агрегата () и могу получать индивидуальные средние для каждого фактора, но не для сгруппированных факторов. Любые идеи будут высоко оценены, спасибо!
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
Это то, что вы ожидаете?
Вот альтернатива. Концептуально, это то же самое, что и ответ Аруна, но он придерживается функций в базе R и, в некотором смысле, сохраняет ваше рабочее пространство и исходные данные несколько аккуратными.
Я предполагаю, что мы начинаем с data.frame
с именем "Temp" и что мы хотим создать два новых 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
к глобальной окружающей среде. Не всем нравится использовать это, но я думаю, что это нормально в данном конкретном случае. Вот как выглядят "Т1" и "Т2".
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