【问题标题】:Repeat values of vector based on an index vector基于索引向量的向量重复值
【发布时间】:2019-04-12 18:52:34
【问题描述】:

我正在尝试使用 apply() 系列的函数。我想创建一个基于索引返回加权平均值的函数。在这种情况下,向量“k”。这是我的示例数据:

#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

我想根据索引向量 k=c(1,2,3,1) 重复 s[1]=25 的值,这样 s[4]=25 也是如此!

最终目标是能够计算:

r <- p/s

【问题讨论】:

  • 因为你的index 不是唯一的
  • 你只是想让s 的长度相同吗,这可行吗:s &lt;- rep(s, 2)[1:length(index)]

标签: r


【解决方案1】:

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 分开

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 2021-12-20
    • 2020-08-19
    • 2021-07-15
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    相关资源
    最近更新 更多