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.frames, "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
Другие вопросы по тегам