2015-04-16 2 views
1

У меня есть кадр данных, один из столбцов, представляющих годы. Скажемагрегация кадра данных по столбцу

region <- c("Spain", "Italy", "Norway") 
year <- c("2010","2011","2012","2010","2011","2012","2010","2011","2012") 
m1  <- c("10","11","12","13","14","15","16","17","18") 
m2  <- c("20","30","40","50","60","70","80","90","100") 
data <- data.frame(region,year,m1,m2) 

Я хочу объединить набор данных m1 таким образом, принимая 3-летние средние значения для каждой страны. Я смущен тем, как это сделать с фреймом данных. Любые комментарии высоко оценены. Спасибо заранее!

+0

Вы должны показать здесь часть ваших данных. – multigoodverse

ответ

1

Во-первых, ваша переменная m1 должна быть числовой. Преобразовать его с помощью as.numeric():

data$m1 <- as.numeric(as.character(data$m1)) 

Затем вы можете использовать aggregate так:

aggregate(m1 ~ region, FUN = mean, data = data) 

# region m1 
# 1 Italy 14 
# 2 Norway 15 
# 3 Spain 13 

Чтобы избежать преобразования неуклюжим типа (as.numeric(as.character())), вы должны устранить цитаты из установки для m1 и m2 :

m1  <- c(10,11,12,13,14,15,16,17,18) 
m2  <- c(20,30,40,50,60,70,80,90,100) 

Альтернативный подход с использованием dplyr:

library(dplyr) 

region <- c("Spain", "Italy", "Norway") 
year <- c("2010","2011","2012","2010","2011","2012","2010","2011","2012") 
m1  <- c(10,11,12,13,14,15,16,17,18) 
m2  <- c(20,30,40,50,60,70,80,90,100) 
data <- data.frame(region,year,m1,m2) 

data %>% 
    group_by(region) %>% 
    summarise(mean_m1 = mean(m1), 
      mean_m2 = mean(m2)) 

# region mean_m1 mean_m2 
# 1 Italy  14  60 
# 2 Norway  15  70 
# 3 Spain  13  50 
+0

Привет, Джейсон, большое спасибо! Поскольку я был смущен, какая часть агрегатной функции сообщает R, чтобы принять среднее значение по сравнению с установленным «годом», я заметил, что результат также неверен. Это должно быть Испания = 11, Италия = 14, Норвегия = 17. Наверное, я могу двигаться дальше отсюда, но просто хотел бы отметить, что ответ не в том, что вопрос задает точно. Благодаря! – Dilara

+0

@ Дилара Хороший улов. Исправлен код. Ошибка связана с преобразованием переменной-фактора в числовую переменную - это требует, чтобы вы сначала преобразовали символ в преобразование в числовое число (которое я исправил), однако, как я заметил в нижней части моего ответа, вы можете быть лучше чтобы удалить кавычки из вашей установки, чтобы избежать конверсии вообще. – JasonAizkalns

+0

да, бежит теперь, спасибо! Может ли «означать» также использоваться для определения средних значений над подмножеством набора, т. Е. Наш набор был {2010,2011,2012}, и если мы хотим получить 2-летние средние по подмножеству {2010,2011}? – Dilara

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