Присвоить веса на основе частоты появления значений - PullRequest
2 голосов
/ 30 мая 2011

Я хотел бы попросить вас помочь с моим фреймом данных. Это вектор многих фаз, и для каждого из нас есть имена переменных. Скажем

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 строк (т. Е. Затем изменятся веса). С Уважением, Alex

Ответы [ 3 ]

3 голосов
/ 30 мая 2011

Я полагаю, вы ищете это:

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
2 голосов
/ 30 мая 2011

Вы можете использовать %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))
1 голос
/ 31 мая 2011

Вы по существу устанавливаете вес var_i в phase_i, поскольку дробь строк var_i встречается в phase_i.Самый простой способ - использовать функцию table(): для заданного вектора дискретных значений он производит подсчет частот различных значений.Если вы хотите получить желаемые веса на основе первых 3 строк фрейма данных vec, вы просто делаете:

> 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
...