2017-01-06 6 views
0

Я пытаюсь вычислить значение в процентах от занятия и года. В качестве примера, используя df ниже, процент первой строки было бы:Как рассчитать процент в разных строках одного столбца?

665/(665 + 709) = 48,4

Я был в состоянии использовать агрегат для вычисления среднего значения, но я застрял на том, как рассчитать проценты: aggregate(x=df$value, by=list(df$occupation, df$year),FUN = mean)

df <- data.frame(
    year = c(rep(2003, 8), rep(2005, 8)), 
    sex = c(rep(0, 4), rep(1, 4)), 
    occupation = rep(c(1:4), 4), 
    value = c(665, 661, 695, 450, 709, 460, 1033, 346, 808, 959, 651, 468, 756, 832, 1140, 431) 
) 
+2

Пожалуйста, ознакомьтесь с этими советами о том, как создать [минимальный, завершающий и проверяемый пример] (http://stackoverflow.com/help/mcve), а также этот пост в [создании отличного примера в R] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). Возможно, следующие советы по [заданию хорошего вопроса] (http://stackoverflow.com/help/how-to-ask) также могут быть полезны для чтения. – lmo

ответ

2

Я думаю, что ответ, который вы ищете:

aggregate(
    x = df$value, 
    by = list(df$occupation, df$year), 
    FUN = function(x) { 
    round(x/sum(x) * 100, 1) 
    } 
) 

в принципе, суть ответа заключается в аргументе FUN; для вычисления процента вам понадобится функция, сообщающая R, что делать при агрегации. Поскольку R имеет встроенную среднюю функцию, вы смогли поставить mean в FUN при вычислении среднего значения. У functional programming chapter Продвинутого R Hadley Wickham намного больше информации о создании именных и анонимных функций.

При этом для задач обработки данных, подобных этому, пакеты, такие как dplyr, действительно превосходят задачу, которая делает задачу менее сложной и удобной для чтения. Вы можете использовать общий ответ выше, но если у вас нет причин (например, для создания пакета и вы хотите избежать зависимостей), дополнительный пакет может сделать ваш код более читабельным и поддерживаемым.

library(dplyr) 
output <- 
    df %>% 
    group_by(year, occupation) %>% 
    mutate(percent = round(value/sum(value) * 100, 1)) 

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

В этом vignette есть множество прекрасных примеров этих задач по управлению данными. dplyr/tidyr cheatsheet также полезен для таких задач.

Мой ответ полагается на dplyr, потому что это мой переход к инструменту; есть, безусловно, другие (plyr, data.table), которые могут быть лучше подходят для данной задачи. Мне все еще нравится dplyr для этой проблемы, но я упоминаю другие варианты, потому что всегда стоит подумать о the best tool for the job.

+0

Большое спасибо! Ты так любезен! Я новый ученик для R, ваш ответ очень полезен для меня! –

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

  • Нет связанных вопросов^_^