2016-03-31 3 views
1

Я пытаюсь группировать некоторые данные в фреймворке данных и выполнять некоторые вычисления по результатам через цикл.Зацикливание нескольких столбцов в фрейме данных в R

Возьмем следующую dataframe- «age_wght»

Year Last_Name First_Name Age Weight 
1 2000  Smith  John 20 145 
2 2000  Smith  Matt 9  85 
3 2005  Smith  John 25 160 
4 2000  Jones  Bob 12 100 
5 2000  Jones  Mary 18 120 
6 2005  Jones  Mary 23 130 
7 2000  Jones  Carrie 9  90 
8 2005  Jones  Bob 17 210 

Я пытаюсь получить средний возраст и вес для каждого человека.

Я могу сделать это с помощью tapply: В настоящее время я рассчитать путем создания нового ключевого столбца в dataframe через:

age_wght $ ключом1 = паста (age_wght $ Last_Name, age_wght $ First_Name, Сентябре =». «)

Year Last_Name First_Name Age Weight  key1 
1 2000  Smith  John 20 145 Smith.John 
2 2000  Smith  Matt 9  85 Smith.Matt 
3 2005  Smith  John 25 160 Smith.John 
4 2000  Jones  Bob 12 100 Jones.Bob 
5 2000  Jones  Mary 18 120 Jones.Mary 
6 2005  Jones  Mary 23 130 Jones.Mary 

Затем, используя tapply, как показано ниже:

< avg_age - с (age_wght, tapply (Возраст, ключ1, ПОТЕХИ = среднее))

< avg_wght -с (age_wght, tapply (вес, key1, FUN = средняя))

< age_wght_summary - data.frame (avg_age, avg_wght)

age_wght_summary

Но что я тогда то, что выглядит следующим образом:

   avg_age avg_wght 
Jones.Bob  14.5 155.0 
Jones.Carrie  9.0  90.0 
Jones.Mary  20.5 125.0 
Smith.John  22.5 152.5 
Smith.Matt  9.0  85.0 

который имеет смысл, поскольку я помещаю в tapply по индексу ключ1, но мой желаемый результат 9 иметь таблицу с заголовками: Last_Name First_Name avg_age avg_wght

Я также попробовал библиотеку dplyr, используя group_by, но не смог заставить ее работать.

+0

Используйте 'aggregate' как -' агрегатный (cbind (Возраст , Вес) ~ Last_Name + Fi rst_Name, data = dat, FUN = mean) ' – thelatemail

ответ

0

dplyr раствор

library(dplyr) 

age_wght %>% 
    group_by(Last_Name, First_Name) %>% 
    summarise(avg_age = mean(Age), 
         avg_wght = mean(Weight)) 

# Last_Name First_Name avg_age avg_wght 
#  (fctr)  (fctr) (dbl) (dbl) 
# 1  Jones  Bob 14.5 155.0 
# 2  Jones  Carrie  9.0  90.0 
# 3  Jones  Mary 20.5 125.0 
# 4  Smith  John 22.5 152.5 
# 5  Smith  Matt  9.0  85.0 

data.table раствор

library(data.table) 
setDT(age_wght)[, .(avg_age = mean(Age), avg_wght = mean(Weight)), by=.(Last_Name, First_Name)] 

# Last_Name First_Name avg_age avg_wght 
# 1:  Smith  John 22.5 152.5 
# 2:  Smith  Matt  9.0  85.0 
# 3:  Jones  Bob 14.5 155.0 
# 4:  Jones  Mary 20.5 125.0 
# 5:  Jones  Carrie  9.0  90.0 
+0

Вы также можете использовать' summaryize_each' как - 'dat%>% group_by (Last_Name, First_Name)%>% summaryize_each (., funs (mean))' – thelatemail

+0

@thelatemail - thanks ; Я всегда забываю о 'summaryize_each' ... – SymbolixAU

+0

Решение data.table отлично работает для меня, спасибо! – boydok

0

base R решение:

nms <- strsplit(rownames(age_wght_summary), split= "\\.") 
data.frame(last_name= lapply(nms, "[", 1), 
      first_name=lapply(nms, "[", 2), 
      avg_age= age_wht_summary$avg_age, 
      avg_age= age_wht_summary$avg_wght) 
Смежные вопросы