Добавить факторную переменную к повторным измерениям людей и их партнеров - PullRequest
0 голосов
/ 12 января 2019

Я работаю с парными животными (самцами и самками) нескольких видов и проводил повторные измерения на нескольких этапах жизни. Вот тип фрейма данных, с которым я работаю:

> ID <- rep(c(seq(from=1, to=4), seq(from=5, to=8)), times=2)
> partner <- rep(c(seq(from=4, to=1), seq(from=8, to=5)), times=2)
> stage<- c(rep("juvenile", 8), rep("adult", 8))
> sex<- rep((rep(c("male", "female"), each=2)), times=4)
> species<-rep(c("a", "b"), each=4, times=2)
> df<-data.frame(ID, partner, stage, sex, species)

 ID partner    stage    sex species
1   1       4 juvenile   male       a
2   2       3 juvenile   male       a
3   3       2 juvenile female       a
4   4       1 juvenile female       a
5   5       8 juvenile   male       b
6   6       7 juvenile   male       b
7   7       6 juvenile female       b
8   8       5 juvenile female       b
9   1       4    adult   male       a
10  2       3    adult   male       a
11  3       2    adult female       a
12  4       1    adult female       a
13  5       8    adult   male       b
14  6       7    adult   male       b
15  7       6    adult female       b
16  8       5    adult female       b

Я хочу добавить факторную переменную с различным уровнем для каждого отдельного самца в пределах вида (например, индивид с ID = 1 всегда имеет уровень фактора A, ID = 2 имеет уровень фактора B и т. Д.), А затем я хочу, чтобы его у партнера должен быть один и тот же уровень фактора (ID = 10 имеет уровень фактора A, ID = 9 имеет уровень фактора B и т. д.). Вот как это должно выглядеть (этот пример невероятно прост):

> df
   ID partner    stage    sex species WANTED
1   1       4 juvenile   male       a      A
2   2       3 juvenile   male       a      B
3   3       2 juvenile female       a      A
4   4       1 juvenile female       a      B
5   5       8 juvenile   male       b      A
6   6       7 juvenile   male       b      B
7   7       6 juvenile female       b      A
8   8       5 juvenile female       b      B
9   1       4    adult   male       a      A
10  2       3    adult   male       a      B
11  3       2    adult female       a      A
12  4       1    adult female       a      B
13  5       8    adult   male       b      A
14  6       7    adult   male       b      B
15  7       6    adult female       b      A
16  8       5    adult female       b      B

Важно отметить:

  • В реальном наборе данных число особей не одинаково среди видов, так что если я возьму буквы в качестве уровней факторов, у вида x с 4 особями будут уровни факторов от A до D, тогда как у вида y с 6 особями будет иметь уровни факторов от А до F.
  • Я хочу, чтобы уровни факторов начинались заново при работе с другими видами (в моем примере фрейма данных ID = 1 имеет уровень фактора A, как и ID = 11, потому что это другой вид).
  • Один и тот же человек должен иметь одинаковый уровень фактора на всех стадиях (ювенильный и взрослый)

Заранее спасибо!

EDIT Вот мой реальный кадр данных, показанный dput, со всеми его трудностями: Извините за его длину! (не уверен, как скрыть это в выпадающем списке). Подводя итог, что я хочу:

  • новая факторная переменная, где у каждого человека есть свой факторный уровень, повторяемый на всех этапах жизни
  • два партнера из данной пары имеют одинаковый уровень фактора
  • уровни факторов повторяются среди видов (штаммов), например, BW имеет A1, A2, ... A8, а LL имеет A1, A2, ... A9
structure(list(ID = c(11489L, 11862L, 11539L, 11713L, 11271L, 
9225L, 11588L, 9906L, 11039L, 9717L, 11539L, 11713L, 11489L, 
11862L, 11403L, 11070L, 11271L, 9225L, 11039L, 9717L, 11588L, 
9906L, 12124L, 12021L, 12029L, 12126L, 12020L, 12030L, 12125L, 
10450L, 11371L, 11605L, 11327L, 11019L, 11741L, 11586L, 11740L, 
11585L, 10575L, 11855L, 11500L, 11403L, 11070L, 11539L, 11713L, 
11740L, 11585L, 11327L, 11019L, 11489L, 11862L, 12124L, 12021L, 
11371L, 11605L, 12631L, 12304L, 12303L, 10008L, 12630L, 12275L, 
12272L, 10007L, 12029L, 12126L, 12125L, 10450L, 11271L, 9225L, 
11588L, 9906L, 11039L, 9717L, 12020L, 12030L, 12910L, 11588L, 
9906L, 11039L, 9717L, 11539L, 11713L, 11271L, 9225L, 11403L, 
11070L, 12094L, 12095L, 11255L, 12390L, 11257L, 11740L, 11585L, 
11327L, 11019L, 11371L, 11605L, 12097L, 11611L, 12124L, 12021L, 
12029L, 12126L, 12125L, 10450L, 12020L, 12030L, 12110L, 12910L, 
12095L, 11740L, 11585L, 11255L, 12097L, 12390L, 11257L, 11611L, 
12094L, 12631L, 12304L, 12303L, 10008L, 11209L, 12630L, 12275L, 
11403L, 11070L, 12272L, 10007L, 12124L, 12021L, 11489L, 11862L, 
10744L, 11209L, 10575L, 12110L, 10744L, 11069L, 11827L, 11066L, 
12816L, 12415L, 12911L, 11248L, 12979L, 12746L, 12912L, 11855L, 
11500L, 11741L, 11586L, 12125L, 10450L, 11248L, 12979L, 12746L, 
12912L, 11066L, 12816L, 11643L, 11435L, 11069L, 11827L, 11327L, 
11019L, 11371L, 11605L, 12631L, 12304L, 12272L, 10007L, 12630L, 
12275L, 12910L, 12095L, 11209L, 10575L, 11643L, 11435L, 12110L, 
10744L, 12771L, 12388L, 11611L, 12094L, 11255L, 12097L, 12390L, 
11257L, 12272L, 10007L, 12303L, 10008L, 12631L, 12304L, 11855L, 
11500L, 12910L, 12095L, 11255L, 12097L, 11741L, 11586L, 12771L, 
12388L, 11069L, 11827L, 11066L, 12816L, 11611L, 12094L, 11855L, 
11500L, 11643L, 11435L, 12303L, 10008L, 11741L, 11586L, 11209L, 
10575L, 12746L, 12912L, 11248L, 12979L, 12630L, 12275L, 12110L, 
10744L, 12029L, 12126L, 11066L, 12816L, 12415L, 12911L, 11069L, 
11827L, 12771L, 12388L, 11643L, 11435L, 12746L, 12912L, 11248L, 
12979L, 12415L, 12911L, 12390L, 11257L, 12415L, 12911L, 12020L, 
12030L, 12771L, 12388L), Partner_ID = c(11862L, 11489L, 11713L, 
11539L, 9225L, 11271L, 9906L, 11588L, 9717L, 11039L, 11713L, 
11539L, 11862L, 11489L, 11070L, 11403L, 9225L, 11271L, 9717L, 
11039L, 9906L, 11588L, 12021L, 12124L, 12126L, 12029L, 12030L, 
12020L, 10450L, 12125L, 11605L, 11371L, 11019L, 11327L, 11586L, 
11741L, 11585L, 11740L, 11209L, 11500L, 11855L, 11070L, 11403L, 
11713L, 11539L, 11585L, 11740L, 11019L, 11327L, 11862L, 11489L, 
12021L, 12124L, 11605L, 11371L, 12304L, 12631L, 10008L, 12303L, 
12275L, 12630L, 10007L, 12272L, 12126L, 12029L, 10450L, 12125L, 
9225L, 11271L, 9906L, 11588L, 9717L, 11039L, 12030L, 12020L, 
12095L, 9906L, 11588L, 9717L, 11039L, 11713L, 11539L, 9225L, 
11271L, 11070L, 11403L, 11611L, 12910L, 12097L, 11257L, 12390L, 
11585L, 11740L, 11019L, 11327L, 11605L, 11371L, 11255L, 12094L, 
12021L, 12124L, 12126L, 12029L, 10450L, 12125L, 12030L, 12020L, 
10744L, 12095L, 12910L, 11585L, 11740L, 12097L, 11255L, 11257L, 
12390L, 12094L, 11611L, 12304L, 12631L, 10008L, 12303L, 10575L, 
12275L, 12630L, 11070L, 11403L, 10007L, 12272L, 12021L, 12124L, 
11862L, 11489L, 12110L, 10575L, 11209L, 10744L, 12110L, 11827L, 
11069L, 12816L, 11066L, 12911L, 12415L, 12979L, 11248L, 12912L, 
12746L, 11500L, 11855L, 11586L, 11741L, 10450L, 12125L, 12979L, 
11248L, 12912L, 12746L, 12816L, 11066L, 11435L, 11643L, 11827L, 
11069L, 11019L, 11327L, 11605L, 11371L, 12304L, 12631L, 10007L, 
12272L, 12275L, 12630L, 12095L, 12910L, 10575L, 11209L, 11435L, 
11643L, 10744L, 12110L, 12388L, 12771L, 12094L, 11611L, 12097L, 
11255L, 11257L, 12390L, 10007L, 12272L, 10008L, 12303L, 12304L, 
12631L, 11500L, 11855L, 12095L, 12910L, 12097L, 11255L, 11586L, 
11741L, 12388L, 12771L, 11827L, 11069L, 12816L, 11066L, 12094L, 
11611L, 11500L, 11855L, 11435L, 11643L, 10008L, 12303L, 11586L, 
11741L, 10575L, 11209L, 12912L, 12746L, 12979L, 11248L, 12275L, 
12630L, 10744L, 12110L, 12126L, 12029L, 12816L, 11066L, 12911L, 
12415L, 11827L, 11069L, 12388L, 12771L, 11435L, 11643L, 12912L, 
12746L, 12979L, 11248L, 12911L, 12415L, 11257L, 12390L, 12911L, 
12415L, 12030L, 12020L, 12388L, 12771L), Strain = structure(c(1L, 
1L, 1L, 1L, 4L, 4L, 4L, 4L, 4L, 4L, 1L, 1L, 1L, 1L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 4L, 1L, 1L, 4L, 4L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 3L, 3L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 3L, 2L, 4L, 4L, 4L, 4L, 1L, 
1L, 4L, 4L, 4L, 4L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 2L, 2L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 3L, 3L, 4L, 4L, 3L, 3L, 
3L, 3L, 1L, 1L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 2L, 2L, 2L, 
2L, 2L, 2L, 1L, 1L, 1L, 1L, 3L, 3L, 2L, 2L, 2L, 2L, 4L, 4L, 1L, 
1L, 4L, 4L, 1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 2L, 4L, 
4L, 1L, 1L, 4L, 4L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 
3L, 3L, 3L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 3L, 3L, 4L, 4L, 4L, 
4L, 2L, 2L, 1L, 1L, 1L, 1L, 3L, 3L, 1L, 1L, 4L, 4L, 2L, 2L, 2L, 
2L, 3L, 3L, 4L, 4L, 3L, 3L, 4L, 4L, 2L, 2L, 4L, 4L, 3L, 3L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), .Label = c("BW", 
"IS", "LL", "PO"), class = "factor"), State = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 2L, 2L, 2L, 2L, 
3L, 3L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 2L, 1L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 
1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 2L, 2L, 4L, 4L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 4L, 4L, 2L, 2L, 
4L, 4L, 4L, 4L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 4L, 4L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 
1L, 2L, 2L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 2L, 2L, 3L, 3L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 
4L, 4L, 4L, 3L, 3L, 4L, 4L, 4L, 4L, 3L, 3L, 2L, 2L, 3L, 3L, 3L, 
3L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 
3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 3L, 4L, 4L, 3L, 3L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 2L, 2L, 4L, 4L, 4L, 4L), .Label = c("Virgin", 
"Mated", "Expecting", "Parent"), class = "factor"), Sex = structure(c(1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 
1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("F", 
"M"), class = "factor")), .Names = c("ID", "Partner_ID", "Strain", 
"State", "Sex"), row.names = c(NA, -256L), class = "data.frame")

Так бы это выглядело так:

       ID Partner_ID Strain  State Sex WANTED
1  11489      11862     BW Virgin   F     A1
2  11862      11489     BW Virgin   M     A1
3  11539      11713     BW Virgin   F     A2
4  11713      11539     BW Virgin   M     A2
5  11271       9225     PO Virgin   F     A1
6   9225      11271     PO Virgin   M     A1
7  11588       9906     PO Virgin   F     A2
8   9906      11588     PO Virgin   M     A2
9  11039       9717     PO Virgin   F     A3
10  9717      11039     PO Virgin   M     A3
11 11539      11713     BW  Mated   F     A2
12 11713      11539     BW  Mated   M     A2
13 11489      11862     BW  Mated   F     A1
14 11862      11489     BW  Mated   M     A1
15 11403      11070     PO Virgin   F     A4
16 11070      11403     PO Virgin   M     A4
17 11271       9225     PO  Mated   F     A1
18  9225      11271     PO  Mated   M     A1
19 11039       9717     PO  Mated   F     A3
20  9717      11039     PO  Mated   M     A3

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Рассмотрим два ave вызова для встроенного метода групповой агрегации. Во-первых, выдает необработанные коэффициенты подсчета групп по Штамм , Штат и Пол , а второй сохраняет первый коэффициент для каждого Partner_ID . Затем оберните весь столбец с as.factor для необходимого преобразования типа.

Ниже with - это тип диспетчера контекста для ссылки на имена столбцов без повторяющейся ссылки на фрейм данных, df$.

# RUNNING GROUP COUNT
df$RAW_WANTED <- as.factor(paste0("A", with(df, ave(ID, Strain, State, Sex, 
                                                    FUN=seq_along))))

# RUNNING FIRST VALUE
df$WANTED <- as.factor(with(df, ave(as.character(RAW_WANTED), Partner_ID,
                                    FUN=function(x) head(x, 1))))

head(df, 20)
#       ID Partner_ID Strain  State Sex RAW_WANTED WANTED
# 1  11489      11862     BW Virgin   F         A1     A1
# 2  11862      11489     BW Virgin   M         A1     A1
# 3  11539      11713     BW Virgin   F         A2     A2
# 4  11713      11539     BW Virgin   M         A2     A2
# 5  11271       9225     PO Virgin   F         A1     A1
# 6   9225      11271     PO Virgin   M         A1     A1
# 7  11588       9906     PO Virgin   F         A2     A2
# 8   9906      11588     PO Virgin   M         A2     A2
# 9  11039       9717     PO Virgin   F         A3     A3
# 10  9717      11039     PO Virgin   M         A3     A3
# 11 11539      11713     BW  Mated   F         A1     A2
# 12 11713      11539     BW  Mated   M         A1     A2
# 13 11489      11862     BW  Mated   F         A2     A1
# 14 11862      11489     BW  Mated   M         A2     A1
# 15 11403      11070     PO Virgin   F         A4     A4
# 16 11070      11403     PO Virgin   M         A4     A4
# 17 11271       9225     PO  Mated   F         A1     A1
# 18  9225      11271     PO  Mated   M         A1     A1
# 19 11039       9717     PO  Mated   F         A2     A3
# 20  9717      11039     PO  Mated   M         A2     A3
0 голосов
/ 12 января 2019

Вот способ сделать то, что я думаю, вы хотите в dplyr и пользовательской функции. Это не так элегантно, но, по крайней мере, легче понять:

library(dplyr)

# This will give you 260 unique factors
facSet <- paste0(rep(LETTERS,each = 10),rep(1:10,times = 10))

getFactor <- function(subsetDF) {
    key <- 1
    subsetDF$Factor <- NA
    for (i in 1:nrow(subsetDF)) {
        if (subsetDF$sex[i] == "male") {
            subsetDF$Factor[i] <- facSet[key]
            key <- key + 1
        }
    }
    for (i in 1:nrow(subsetDF)) {
        if (subsetDF$sex[i] == "female") {
            subsetDF$Factor[i] <- unique(subsetDF$Factor[which(subsetDF$partner[i] == subsetDF$ID)])[1]
        }
    }
    return(subsetDF$Factor)
}

df <- df %>% group_by(species) %>% mutate(Factor = getFactor(data.frame(ID,sex,partner)))

Выход:

> df
# A tibble: 16 x 6
# Groups:   species [2]
      ID partner stage    sex    species Factor
   <int>   <int> <fct>    <fct>  <fct>   <chr> 
 1     1       4 juvenile male   a       A1    
 2     2       3 juvenile male   a       A2    
 3     3       2 juvenile female a       A2    
 4     4       1 juvenile female a       A1    
 5     5       8 juvenile male   b       A1    
 6     6       7 juvenile male   b       A2    
 7     7       6 juvenile female b       A2    
 8     8       5 juvenile female b       A1    
 9     1       4 adult    male   a       A3    
10     2       3 adult    male   a       A4    
11     3       2 adult    female a       A2    
12     4       1 adult    female a       A1    
13     5       8 adult    male   b       A3    
14     6       7 adult    male   b       A4    
15     7       6 adult    female b       A2    
16     8       5 adult    female b       A1 

Примечание: если вам нужно более 260 уникальных пар мужчина-женщина, создайте больший facSet !

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...