2013-07-13 3 views
-3

У меня есть следующий dataframe:взвешенное среднее по дате

df = data.frame(date = c("26/06/2013", "26/06/2013", "26/06/2013", "27/06/2013", "27/06/2013", "27/06/2013", "28/06/2013", "28/06/2013", "28/06/2013"), return = c(".51", ".32", ".34", ".39", "1.1", "3.2", "2.1", "5.3", "2.1"), cap = c("500", "235", "392", "213", "134", "144", "232", "155", "213"), weight = c("0.443655723", "0.20851819", "0.347826087", "0.433808554", "0.272912424", "0.293279022", "0.386666667", "0.258333333", "0.355")) 

Я хотел бы вычислить:

1) В последней колонке «вес». Который является весом столбца «cap» PER DAY.

2) Весовое «колпачок» означает «возврат» в день. Я хочу, чтобы получить следующий вывод:

result = data.frame(date = c("26/06/2013", "27/06/2013", "28/06/2013"), cap.weight.mean = c("0.411251109", "1.407881874", "2.926666667")) 
+0

привет и добро пожаловать на SO. Не могли бы вы рассказать о своем вопросе. В частности, что означает «последний столбец веса»? Является ли 'weight' не последним столбцом' df'. Кроме того, что вы имеете в виду под «взвешенным колпачком»? –

ответ

0

При необходимости, изменить факторы в числовом первой

df$return=as.numeric(levels(df$return))[df$return] 
df$cap=as.numeric(levels(df$cap))[df$cap] 
df$weight=as.numeric(levels(df$weight))[df$weight] 

Вопрос 1)

library(plyr) 
#pretend weight column were absent in df 
ddply(df[,-ncol(df)],"date",function(x) data.frame(x,weight=x$cap/sum(x$cap))) 

Вопрос 2)

library(plyr) 
ddply(df,"date",function(x) data.frame(date=x$date[1],cap.weight.mean=sum(x$cap*x$return)/sum(x$cap))) 
0

Вот еще один вариант: by!

После преобразования в числовое обозначение как cryo111.

R> by(df, df$date, FUN = function(x) weighted.mean(x$return, w = x$weight)) 
df$date: 26/06/2013 
[1] 0.4112511 
------------------------------------------------------------ 
df$date: 27/06/2013 
[1] 1.407882 
------------------------------------------------------------ 
df$date: 28/06/2013 
[1] 2.926667 

Это дает информацию в вашем result data.frame. Я предполагаю, что это то, что вы ищете

Вот еще одно решение с использованием memisc:::aggregate.formula

> library(memisc) 
> aggregate(weighted.mean(return, weight) ~ date, data = df) 
>  date weighted.mean(return, weight) 
1 26/06/2013      0.4112511 
4 27/06/2013      1.4078819 
7 28/06/2013      2.9266667 
2

Другая возможность использования функции plyr:

library(plyr) 
# Change factor to numeric 
> df[,-1]<-sapply(df[,-1],function(x){as.numeric(as.character(x))}) 
> ddply(df,.(date),summarize,cap.weight.mean=weighted.mean(return,weight)) 
     date cap.weight.mean 
1 26/06/2013  0.4112511 
2 27/06/2013  1.4078819 
3 28/06/2013  2.9266667 
Смежные вопросы