Повторите значения вектора на основе индекса вектора - PullRequest
1 голос
/ 12 апреля 2019

Я пытаюсь попрактиковаться в использовании функций из семейства apply (). Я хочу сделать функцию, которая возвращает взвешенное среднее значение на основе индекса. В этом случае вектор «к». Вот мои образцы данных:

#gen data

i=c(1,2,3,4)
j=c(1,2,1,2)
k=c(1,2,3,1)
t=c(1,1,1,1)

w=c(5,10,15,20)
d=c(4,5,10,2)
df<- data.frame(i,j,k,t,w,d)


#weighted mean

w=df[,"w"]
y=df[,"d"]
index=df[,"k"]

Далее у меня проблема с размерами векторов p и s.

p <- w*y
s <- array(tapply(w,index,FUN=sum))

dim(p) = 4
dim(s) = 3

Я хотел бы повторить значение s [1] = 25 на основе вектора индекса k = c (1,2,3,1), чтобы s [4] = 25 также!

Конечная цель - вычислить:

r <- p/s

1 Ответ

0 голосов
/ 12 апреля 2019

Решение на одну линию для weighted mean с использованием data.table

> library(data.table)
> setDT(df)[, weighted.mean(d, w), by=k]

   k   V1
1: 1  2.4
2: 2  5.0
3: 3 10.0

Решение В зависимости от вашего подхода -

Вы можете использовать data.table пакет, чтобы сделатьчто-

p <- setDT(df)[,w*d,by=.(k)][,lapply(.SD, sum),by=k][,V1]
s <- array(tapply(w,index,FUN=sum))
r <- p/s

[1]  2.4  5.0 10.0

Входные данные-

i=c(1,2,3,4)
j=c(1,2,1,2)
k=c(1,2,3,1)
t=c(1,1,1,1)

w=c(5,10,15,20)
d=c(4,5,10,2)
df<- data.frame(i,j,k,t,w,d)

Примечание - Вам необходимо свернуть sum на index перед делениемэто с s

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