2015-04-19 3 views
2

Я хотел бы рассчитать среднее значение выборки в R, введя конкретные критерии. Например, у меня есть эта таблица, и я хочу средства только те, для которых стадия = 1 или 2:вычислить среднее по критериям в R

treatment session period stage wage_accepted type 
1   1  1  1   25 low 
1   1  1  3   19 low 
1   1  1  3   15 low 
1   1  1  2   32 high 
1   1  1  2   13 low 
1   1  1  2   14 low 
1   1  2  1   17 low 
1   1  2  4   16 low 
1   1  2  5   21 low 

Желаемых в этом случае должна быть:

stage mean 
     1 21.0 
     2 19.6667 

Спасибо заранее.

ответ

2

С dplyr библиотеки

library(dplyr) 

df %>% filter(stage==1 | stage ==2) %>% group_by(stage) %>% 
    summarise(mean=mean(wage_accepted)) 

Если вы новичок в dplyr немного объяснения:

Возьмите фрейм данных df, затем filter, где stage равен 1 или 2. Затем для каждого group в stage вычислить mean из wage_accepted

+0

Спасибо, это полезно. Однако мои данные действительно большие, и приведенный выше пример. Я хотел бы выбрать 25 ответов переменной, которая имеет 50. В этом случае (этап фильтра == 1 | .... | stage == 25) будет немного длиннее. Как я могу сделать это более эффективно? – rado

+0

Используйте 'filter (stage% in% 1:25)' –

+0

он качественный не в количественном выражении. Ответы, например, «A», «B», «C» и т. Д. ... – rado

0

Вы можете сделать это, а потом фильтр для этапов согласно вашему требованию

# Calculating mean with respect to stages 
df = do.call(rbind, lapply(split(data, f = data$stage),function(x) out = data.frame(stage = unique(x$stage), mean = mean(x$wage_accepted)))) 

# mean for stage 1 and 2 
required = subset(df, stage %in% c(1,2)) 
2

Если у вас есть файл CSV для данных, вы можете прочитать данные в кадре данных с помощью:

data<-read.csv("PATH_TO_YOUR_CSV_FILE/Name_of_the_CSV_File.csv") 

Затем вы можете использовать либо этот код, опираясь на sapply() :

sapply(split(data$Wage_Accepted,data$Stage),mean) 

    1  2  3  4  5 
21.00000 19.66667 17.00000 16.00000 21.00000 

Или этот код опираясь на tapply():

tapply(data$Wage_Accepted,data$Stage,mean) 

    1  2  3  4  5 
21.00000 19.66667 17.00000 16.00000 21.00000 
+0

Спасибо @ bgfriend0 за ваши предложения. –

2

Проверьте это. Это игрушечный пример, но data.table настолько компактен. Очевидно, что dplyr отлично.


    library(data.table) 

    dat <- data.table(iris) 
    dat[Species == "setosa" | Species == "virginica", mean(Sepal.Width), by = Species] 

С точки зрения вашей потребности в скорости ... data.table - это ракетный корабль, который ищет его. Я оставлю это вам, чтобы применить это к вашему вопросу. Best, M2K

Смежные вопросы