R - разделить один вектор на два отдельных вектора по условию (случай/контрольный пациент)

Я новичок в R и работаю с ЭЭГ, полученной от спящих пациентов. Теперь у меня есть таблица, похожая на эту:

 ID   C3-M2  C4-M1  Disorder
 12     347    325   Control
 13     397    346   Bipolar
 14     368    363   Control
 15     370    379   Control
 16     368    310   Bipolar

Поскольку мне нужно было среднее значение C3-M2 и C4-M1, я создал вектор:

fast_spin_numb <- c((`C3-M2`+ `C4-M1`)/2)

Таким образом, fast_spin_numb должен содержать 5 значений.

Теперь я хотел бы создать два отдельных вектора, из которых fast_spin_bipo должны содержать только средние значения пациентов с биполярным расстройством, а fast_spin_cont — только средние значения элементов управления.

Я пробовал это с

split(fast_spin_numb, disorder == "control", drop = FALSE) 

но я не мог найти решение, как автоматически помещать числа в новые векторы.

Я также пробовал это:

tapply(fast_spin_numb, disorder, shapiro.test)

что позволяет мне, по крайней мере, запустить некоторые тесты. Но это не помогает мне, например, создать qqplot (только для элементов управления).

Спасибо большое уже!!


person ElenaNick    schedule 07.11.2017    source источник


Ответы (1)


Рассмотрим by, объектно-ориентированную оболочку для tapply, которая может подмножить кадр данных одним или несколькими факторами, чтобы вернуть список выходных данных из функции. Ниже возвращается именованный список векторов.

Данные

txt = ' ID   "C3-M2"  "C4-M1"  Disorder
12     347    325   Control
13     397    346   Bipolar
14     368    363   Control
15     370    379   Control
16     368    310   Bipolar'

df <- read.table(text=txt, header=TRUE)

Код

mean_vectors <- by(df, df$Disorder, FUN=function(i) (i$`C3.M2`+ i$`C4.M1`)/2)

mean_vectors$Control
# [1] 336.0 365.5 374.5
mean_vectors$Bipolar
# [1] 371.5 339.0
person Parfait    schedule 07.11.2017
comment
Это дополняет мою недавнюю продолжающуюся кампанию по продвижению малоиспользуемого by в R: 1, 2, 3, 4, 5 - person Parfait; 07.11.2017
comment
Большой! Рад помочь. Не забывайте способ StackOverflow сказать спасибо! - person Parfait; 08.11.2017