Вычисление средних по группам с R - PullRequest
0 голосов
/ 21 марта 2012

У меня есть данные, с которыми я бы хотел вычислить статистику. Данные организованы таким образом, что у меня есть значение, соответствующее каждому трехэлементному кортежу Что-то вроде

(P1,M1,R1,V1)
(P1,M1,R2,V2)
(P1,M2,R1,V1)
...

здесь P1, M1 и R1 не числовые, а V1 и V2. Сейчас у меня есть данные в файле CSV, x2.cvs следующим образом:

P,M,R,V
P1,M1,R1,V1
P1,M1,R2,V2
...

Я читаю данные, используя

d = read.table("x2.csv", sep=",", header=TRUE)

но после этого я не знаю, что делать для обработки данных.

Я хотел бы начать с вычисления простой информации, такой как: каково среднее значение для каждого элемента P (поэтому среднее значение будет по всем элементам M и R), или для каждой пары элементов {P, M} (поэтому среднее значение здесь будет по элементам R.

Далее я хотел бы сделать немного более сложные вещи, например, вычислить, сколько элементов P1 больше определенного значения.

Ответы [ 2 ]

6 голосов
/ 21 марта 2012

Вот начало, с data.table, plyr и базовыми функциями, есть так много других способов ...

Во-первых, некоторые примеры данных ...

dput(examp)
structure(list(P = structure(c(1L, 1L, 1L, 2L), .Label = c("P1", 
"P2"), class = "factor"), M = structure(c(1L, 1L, 2L, 2L), .Label = c("M1", 
"M2"), class = "factor"), R = structure(c(1L, 2L, 1L, 1L), .Label = c("R1", 
"R2"), class = "factor"), V = c(23, 49, 24, 29)), .Names = c("P", 
"M", "R", "V"), row.names = c(NA, -4L), class = "data.frame")
#
# to give something like what you have...
#
examp
   P  M  R  V
1 P1 M1 R1 23
2 P1 M1 R2 49
3 P1 M2 R1 24
4 P2 M2 R1 29

Вот один из способов использования data.table.Если ваш объект данных очень большой, пакет data.table окажется очень быстрым, документация также превосходна: http://datatable.r -forge.r-project.org / datatable-intro.pdf

# What is the average of each element of P?
library(data.table)
examp.dt <- data.table(examp)
setkey(examp.dt,P)
examp.dt[,mean(V),by=P]
      P V1
[1,] P1 32
[2,] P2 29
#

И еще один, использующий plyr

# What is the average of each element of P?
library(plyr)
ddply(examp, "P", function(df)mean(df$V))
P V1
1 P1 32
2 P2 29

И еще один, использующий базу R

# What is the average of each element of P?
# for example using the by() function,  tapply() would be similar
with(examp, by(examp, P, mean))
P: P1
P  M  R  V 
NA NA NA 32 
------------------------------------------------- 
P: P2
P  M  R  V 
NA NA NA 29
#
# What is the average of each element of R? 
with(examp, by(examp, R, mean))
R: R1
P        M        R        V 
NA       NA       NA 25.33333 
----------------------------------------------
R: R2
P  M  R  V 
NA NA NA 49 
#
# the same, using tapply
with(examp, tapply(V, R, mean)
  R1       R2 
25.33333 49.00000

И, на ваш последний вопрос, сколько элементов P1больше определенного значения, мы можем использовать subset, например, так:

# how many elements of P1 are greater than 20?
nrow(subset(examp, examp$P=="P1" & examp$V>20))
[1] 3

или даже просто [ для того же результата с меньшим набором:

nrow(examp[examp$P=="P1" & examp$V>20,])
[1] 3
5 голосов
/ 21 марта 2012

Функция aggregate, вероятно, является самой простой в использовании для того, что вы спрашиваете:

1) каково среднее значение для каждого элемента P ?

aggregate(formula = V ~ P, data = d, FUN = mean)

2) или для каждой пары элементов {P, M} ?

aggregate(formula = V ~ M + R, data = d, FUN = mean)

3) на сколько элементов P1 больше определенного значения ?

aggregate(formula = V ~ P, data = d, FUN = function(x)sum(x > 10))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...