2016-09-27 2 views
0

Я пытаюсь найти среднее значение (среднее значение) переменной, специфичной для уровня I, назначенного другой переменной.Определить среднее значение переменной для определенного уровня в R

До сих пор я создал новую переменную с различными уровнями, связанными с ним (уровень 1 = значения < = 0%, уровень 2 = значения < 1%, а уровень 3 = значения> = 1%.

pincome$income_growth <- ifelse(pincome$incomechng <= 0, "level 1", 
           ifelse(pincome$incomechng < 1,"level 2","level 3")) 

Теперь я хочу, чтобы определить среднее значение другой переменной, связанной с указанными выше уровнями (например, средний доход на 1-го уровня (рост доходов меньше, чем 0%).

Я надеюсь, что это имеет смысл, я очень много новичка в R и пытаться его повесить!

Спасибо!

+0

Я предполагаю, что правильный путь это что-то вроде 'с (DF, пр (v, уровень)) или' с (DF, tapply (v, уровень)) ', где' DF' ваши данные .frame, 'v' - ваша переменная, а' level' - ваша переменная группировки. Чтобы узнать больше, введите '? Ave' и'? Tapply'. – Frank

ответ

0

Попробуйте by (?by), если вы хотите основание R. Если вы начинаете делать более сложные вещи, то plyr/dplyr пакеты довольно удивительно, и если вы собираетесь слоняться вокруг с огромными наборами данных и не против немного больше из начальной кривой обучения, пакет data.table также потрясающий.

A reproducible example будет фантастическим.

E.g.

set.seed(1) # so your random numbers are the same as mine 
pincome <- data.frame(incomechng = runif(20, min=-1, max=3)) 

# what you had was fine too; using ?cut is another way to do it 
# have just put it in for demonstration purposes. 
# though `cut` uses intervals like (a, b] or [a, b) whereas yours 
# are (-Inf, 0] (0, 1) [1, Inf) which is a little different.  
pincome$income_growth <- cut(pincome$incomechng, 
          breaks=c(-Inf, 0, 1, Inf), 
          labels=paste("level", 1:3)) 

Теперь мы можем принять среднее значение в каждой группе. Я показал три варианта; Я уверен, что их больше.

# base R ?by 
by(pincome$incomechng, pincome$income_growth, mean) 
# pincome$income_growth: level 1 
# [1] -0.6848674 
# ------------------------------------------ 
# pincome$income_growth: level 2 
# [1] 0.4132334 
# ------------------------------------------ 
# pincome$income_growth: level 3 
# [1] 1.772039 

# plyr (dplyr has pipe syntax you may prefer but is otherwise the same) 
library(plyr) 
ddply(pincome, .(income_growth), summarize, avgIncomeGrowth=mean(incomechng)) 
# income_growth avgIncomeGrowth 
# 1  level 1  -0.6848674 
# 2  level 2  0.4132334 
# 3  level 3  1.7720395 

# data.table 
library(data.table) 
setDT(pincome) 
pincome[, list(avgIncomeGrowth=mean(incomechng)), by=income_growth] 
# income_growth avgIncomeGrowth 
# 1:  level 2  0.4132334 
# 2:  level 3  1.7720395 
# 3:  level 1  -0.6848674 
Смежные вопросы