2017-02-26 4 views
0

J'ai une liste d'objets: zone $ X1, zone $ X2, zone $ X3, zone $ X4, ... zone $ X100.La classe de chaque l'objet est numérique. Ces objets sont extraits des résultats d'un SpatialPixelsDataFrame. J'ai calculé la zone tampon pour différentes traces d'animaux de 1 à 100.extraire les caractères d'une liste de noms et en faire une commande numérique

Par exemple. La zone $ X1 est 0,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,0,0 Je veux compter le nombre de 1 dans la zone $ X1, donc je commande utilisé

table<-table(area$X1) 
0  1 
600097 1504 
#extract the number of 1s 
table[[2]] 

qui me donne 1504

cela donnerait le nombre de 1, et donc me donner la taille de la zone tampon.

Cependant, je veux faire la même chose pour tous les autres objets, la zone $ X2 jusqu'à la zone $ X100. Et calculer le nombre moyen de 1 dans l'ensemble. Je veux automatiser ce processus. Comment puis-je le faire?

Actuellement, ce que je faisais est de créer une liste de noms

names<-paste("area$X",1:100,sep="") 

Pendant que je reçois la liste des noms que je voulais, la classe d'éléments en « noms » est le caractère.

names: "area$X1" "area$X2" "area$X3" "area$X4" "area$X5" "area$X6" "area$X7" 
..."area$X99" "area$X100" 
class(names[1]): "character" 

"zone $ X1" n'est plus le chiffre que je voulais. Pour ajouter, maintenant, si je tente commande:

table(names[1]) 
    area$X1 
       1 

il ne sera pas une table de 0 et 1. Il contient tout simplement un élément, qui est le nom de « zone $ X1 ».

J'ai essayé d'enlever des guillemets mais cela n'a pas aidé.

Quelqu'un peut-il m'aider avec ceci? Merci !!!

Répondre

0

Si votre région ne dispose que 0 ou des 1, vous pouvez simplement utiliser colSums pour obtenir le nombre de 1

colSums(area) 
mean_area <- mean(colSums(area)) 

Sinon, et vous voulez vous assurer que vous ne comptant que le nombre de valeurs avec de 1, vous pouvez définir la zone == 1

colSums(area == 1) 

vous pouvez également utiliser appliquer pour itérer la colonne sage fonctions (ou une ligne sage, voient? appliquer) pour référence ultérieure si vous avez des calculs plus complexes

apply(area, 2, function(x) sum(x == 1)) 
mean_area <- mean(apply(area, 2, function(x) sum(x == 1))) 

Par exemple

area <- as.data.frame(matrix(sample(c(0,1), replace=TRUE, 50), 5, 10)) 
colnames(area) <- paste0("X", 1:ncol(area)) 

area$X1 == 1 # gives TRUE, FALSE, which is equivalent to 1, 0 and can be summed to get the number of 1's 
# [1] FALSE FALSE TRUE FALSE TRUE 
sum(area$X1) 
# [1] 2 
+0

colSums n'a pas fonctionné parce que la zone est dans la classe de SpaitalPiexelsDataFrame –

+0

un peu de chance avec l'option d'application? – Djork

+0

Merci. Appliquer la fonction fonctionne. Mais existe-t-il un moyen de calculer la variance de la zone pour chaque ID? –

0

Votre réponse est très utile. J'ai finalement élaboré le code suivant

for (i in 1:length(uniqueID)){ 
b<-apply(area[i],1,function(x) sum(x == 1)) 
c<-c+sum(b) 
} 
mean<-c/length(uniqueID) 

Merci beaucoup! Mais existe-t-il un moyen de calculer la variance de la zone pour chaque ID?