2015-05-20 4 views
1

Мне нужно рассчитать медианную формулу ROE1, ROE2 и ROE3. Но, чтобы вычислить каждую медиану, я должен включить все строки с теми же Datum и теми же категориями Ind. Например, чтобы вычислить медиану второй строки, я должен включить строки 2 и 3, потому что у меня есть те же Datum и Ind в строках 2 и 3. Я пытаюсь использовать функцию цикла apply, но я Не знаю, как я могу включить это условие.вычислить медианную по нескольким векторам

Это как условная медиана.

Большое спасибо за внимание.

Вот, это пример:

Datum Ind ROE1 ROE2 ROE3 
95  45 NA  6  13 
95  45 18  25  28 
95  50 10  15  20 

ответ

2

Вот возможный data.table решение

library(data.table) 
setDT(df)[, list(Median = median(unlist(.SD), na.rm = TRUE)), by = list(Datum, Ind)] 
# Datum Ind Median 
# 1: 95 45  18 
# 2: 95 50  15 

Другой вариант привести в порядок данные первого использования melt

melt(setDT(df), id.vars = c("Datum", "Ind"))[, 
        list(Median = median(value, na.rm = TRUE)), 
        by = list(Datum, Ind)] 

# Datum Ind Median 
# 1: 95 45  18 
# 2: 95 50  15 

Или если вы поклонник Hadleyverse, может также сделать

library(tidyr) 
library(dplyr) 
df %>% 
    gather(Variable, value, -(Datum:Ind))%>% 
    group_by(Datum, Ind) %>% 
    summarise(Median = median(value, na.rm = TRUE)) 

# Source: local data frame [2 x 3] 
# Groups: Datum 
# 
# Datum Ind Median 
# 1 95 45  18 
# 2 95 50  15 
+0

Дорогой Дэвид Arenburg, –

+0

Дорогой Дэвид Arenburg, спасибо большое за ваш ответ. Все они работали на моем примере, но, к сожалению, это не в моих первоначальных данных. Когда я использую функцию: setDT (df) ... Результат медианы не соответствует категориям. Возможно, это потому, что у меня есть категории только с значениями NA. Когда я пытаюсь подмножество только строк без значений NA, результат медианы ошибочен. Есть ли у вас какие-либо предложения? Другие решения У меня есть эта ошибка. Столбец 1 результата для группы 5 - это тип «double», но ожидающий тип «character». Типы столбцов должны быть согласованными для каждой группы.) –

+0

Можете ли вы предоставить воспроизводимый пример, когда это не работает? –

2

другой вариант, с основанием R, вы можете сделать:

med_by <- aggregate(df, by=list(df$Datum, df$Ind), median, na.rm=T)[, -(1:2)] 
data.frame(med_by[, 1:2], Median=apply(med_by[, grepl("ROE", colnames(med_by))], 1, median)) 

# Datum Ind Median 
# 1 95 45  18 
# 2 95 50  15 
Смежные вопросы