我想请求您帮助我的数据框。它是许多阶段的向量,每个阶段我们都有变量的名称。让我们说
vec<-data.frame(phase1= c("var1","var2","var3","var4","var5","var6"),
phase2= c("var1","var3","var4","var2","var6","var5"),
phase3= c("var4","var3","var2","var1","var6","var5"))
vec
phase1 phase2 phase3
1 var1 var1 var4
2 var2 var3 var3
3 var3 var4 var2
4 var4 var2 var1
5 var5 var6 var6
6 var6 var5 var5
现在,假设我们对前3行感兴趣,因此其中一个变量的权重为1/3,否则为零。理想情况下,我的函数输出如下:
phase1 phase2 phase3
var1 0.33 0.33 0
var2 0.33 0 0.33
var3 0.33 0.33 0.33
var4 0 0.33 0.33
var5 0 0 0
var6 0 0 0
该功能也适用于前4行,5行或全部6行(即权重会随之改变)。 问候, 亚历
答案 0 :(得分:3)
我相信你正在寻找这个:
n<-3
l<-dim(vec)[1]
wghts<-c(rep(1/n, n), rep(0, l-n))
result<-do.call(cbind, lapply(vec, function(curcol){
wghts[match(curcol, vec$phase1)]
}))
如果需要,您可以添加:
rownames(result)<-vec$phase1
答案 1 :(得分:2)
您可以使用%in%
查找匹配项,使用ifelse
设置权重:
set_weigth <- function(x, v, w) ifelse(x%in%v,w,0)
as.data.frame(lapply(vec, set_weigth, v=vec$phase1[1:3], w=0.33))
答案 2 :(得分:1)
您基本上在var_i
中设置phase_i
的权重,因为var_i
中出现phase_i
行的分数。最简单的方法是使用table()
函数:给定离散值的向量,它产生不同值的频率计数。如果您想根据数据框vec
的前3行获得所需的权重,您只需执行以下操作:
> sapply(vec[1:3,],table)/3
phase1 phase2 phase3
var1 0.3333333 0.3333333 0.0000000
var2 0.3333333 0.0000000 0.3333333
var3 0.3333333 0.3333333 0.3333333
var4 0.0000000 0.3333333 0.3333333
var5 0.0000000 0.0000000 0.0000000
var6 0.0000000 0.0000000 0.0000000
同样,如果你想使用前4行:
> sapply(vec[1:4,],table)/4
phase1 phase2 phase3
var1 0.25 0.25 0.25
var2 0.25 0.25 0.25
var3 0.25 0.25 0.25
var4 0.25 0.25 0.25
var5 0.00 0.00 0.00
var6 0.00 0.00 0.00