2017-08-16 3 views
1

J'essaie d'ajouter une nouvelle colonne à une trame de données existante qui montre le nombre d'une matrice binaire. Une colonne dans la trame de données existante a les noms de la matrice dont le nombre/somme que j'essaie de trouver.R - Utilisation de la valeur de colonne dans la trame de données pour rechercher le nom de la matrice et récapituler la matrice

Par exemple,

r <- 10 
c <- 10 
MatA <- matrix(sample(0:1,r*c, replace=TRUE),r,c) 
MatB <- matrix(sample(0:1,r*c, replace=TRUE),r,c) 
MatC <- matrix(sample(0:1,r*c, replace=TRUE),r,c) 

mat <- c("MatA","MatB","MatC") 
size <- c(4,6,10) 
df <- data.frame(mat,size) 

Je dois rechercher les valeurs de la colonne mat tels que MatA, MatB, MatC de df dataframe pour faire correspondre les noms de matrice MatA, MatB, MatC et retourne le nombre de 1 dans chacune de la matrice binaire ajouté à la df dataframe dans une nouvelle colonne.

J'ai essayé d'utiliser des boucles, appliquer des fonctions, mais je suis perdu comment utiliser la colonne des valeurs MatA de df$mat comme une recherche pour le nom de la matrice MatA et revenir à sum(MatA==1) nouvelle colonne dans dataframe df.

Répondre

0

Utilisez get à la grandeur de référence par chaîne

set.seed(7) 
df$binary <- lapply(mat, function(x) sum(get(x))) 

Pour utiliser la colonne data.frame si elles sont stockées en tant que facteurs

df$binary <- lapply(levels(df$mat)[df$mat], function(x) sum(get(x))) 

Pour stocker la colonne sous forme de chaînes et non facteurs

df <- data.frame(mat, size, stringsAsFactors = FALSE) 
df$binary <- lapply(df$mat, function(x) sum(get(x))) 

> df 
    mat size binary 
1 MatA 4  47 
2 MatB 6  58 
3 MatC 10  54 
+0

Merci, j'essayais d'utiliser le 'lapply' sans utiliser la référence' get'. Cela fonctionne magnifiquement. – user6529266