2017-01-13 2 views
1

J'ai une question. Je travaille sur la construction d'un système de recommandation en R, et je suis assez nouveau dans la langue. Je n'arrive pas à comprendre ce qui suit.Comment recoder des valeurs dans une matrice en fonction d'un calcul?

J'ai une matrice comme:

eventID g_26 g_27 g_28 g_29 g_30 g_31 g_32 g_33 g_34 g_35 g_36 g_37 g_38 g_39 g_40 g_41 g_42 g_43 
1: 1010 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 
2: 1016 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 
3: 1019 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 
4: 1053 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 
5: 1168 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 
6: 1188 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

Que Id aiment faire est de remplacer toutes les valeurs qui ont 1 à 1/sqrt (n total de 1 dans cette ligne particulière). J'utilise également le package Data Table si cela facilite la tâche.

Merci d'avance!

Répondre

0

Nous pouvons spécifier les colonnes d'intérêt .SDcols (-1 implique, nous avons sélectionné toutes les colonnes à l'exception la première colonne), obtenir la somme de chaque ligne dans le sous-ensemble de Data.table avec Reduce et +, prendre la racine carrée (sqrt), diviser par 1, multiplier avec le sous-ensemble de data.table (.SD) et affecter (:=) aux colonnes d'intérêt

dt[, (2:ncol(dt)) := .SD*1/sqrt(Reduce(`+`, .SD)), .SDcols = -1] 
+2

Akrun, s'il vous plaît ne pas copier coller mes réponses avec des changements minimes. Vous avez eu une boucle for there. Explorez votre créativité. –

+0

@RonakShah Ce n'est pas votre réponse. S'il vous plaît vérifier – akrun

+2

Je suis bien au courant de toutes vos astuces. S'il vous plaît voir votre révision d'édition si vous avez un doute de ce que je parle. –

0

À titre d'exemple

m <- matrix(c(1, 1, 0, 1, 0, 0, 1, 0, 0), ncol = 3, byrow = T) 

rs <- apply(m,1,sum) 
rs <- sqrt(rs) 

m <- m/rs 

espère que cela vous

1

Nous pouvons multiplier le dataframe avec la valeur.

Tous les chiffres qui sont 0 resteront 0 et celui avec 1 volonté de se changer à la sortie désirée

df[-1] * 1/sqrt(rowSums(df==1)) 
+0

Cela semble fonctionner, cependant, il change également tous les 1 dans ma colonne eventID (par exemple. L'ID # 1010 comptera comme deux 1 depuis son numérique. Toute modification pour éviter cette colonne? –

+0

@StefanMusch J'ai ignoré cela en utilisant l'index '-1' dans' df'. Il ignorera la première colonne de la base de données. –

+0

@StefanMusch J'ai posté une réponse data.table. S'il te plaît vérifie le. Il n'a pas ce problème – akrun