2014-05-05 4 views
0

J'ai un énorme cadre de données. Je suis coincé avec la fonction if. Permettez-moi tout d'abord présenter l'exemple simple, puis je me couchai mon problème:R: si fonction avec deux conditions?

z <- c(0,1,2,3,4,5) 
y <- c(2,2,2,3,3,3) 
a <- c(1,1,1,2,2,2) 
x <- data.frame(z,y,a) 

Problème: Je veux courir si la fonction qui résume la colonne valeurs z base pour la ligne qui a même y et un que si la deuxième rangée de chaque groupe a correspondant z est égal à 1

Je suis désolé mais je suis tout à fait nouveau en R donc pas en mesure de présenter tous les codes raisonnables que je l'ai fait par moi-même.

Toute aide serait grandement appréciée.

+2

Pouvez-vous également inclure un échantillon de la sortie désirée? C'est difficile à comprendre à partir de l'énoncé du problème. – ilir

Répondre

3

Comme mentionné, votre problème n'est pas clairement indiqué.

Peut-être que vous cherchez à faire quelque chose comme ceci:

x$new <- with(x, ave(z, y, a, FUN = function(k) 
    ifelse(k[2] == 1, sum(k), NA))) 
x 
# z y a new 
# 1 0 2 1 3 
# 2 1 2 1 3 
# 3 2 2 1 3 
# 4 3 3 2 NA 
# 5 4 3 2 NA 
# 6 5 3 2 NA 

Ici, j'ai créé une nouvelle colonne « nouvelle » qui résume les valeurs de « z » regroupées par « y » et « a » , mais seulement si la deuxième valeur dans le groupe est égale à 1.

+0

Je suis vraiment désolée de ne pas avoir pu expliquer ce dont j'ai besoin, mais ce que vous avez fait est complètement ce que j'ai cherché. Un grand merci à vous!) – Jack

1

Puisque vous dites que votre cadre de données est assez grand, vous pouvez convertir votre trame de données en un objet data.table en utilisant le package data.table. Vous trouverez probablement que les opérations requises sont beaucoup plus rapides si vous avez un grand nombre de lignes. Cependant, la construction du code pour votre cas n'est pas simple avec data.table.

Si j'understnad ce que vous voulez faire (ce qui est pas tout à fait clair pour moi), vous pouvez essayer ce qui suit:

library(data.table) 
z <- c(0,1,2,3,4,5) 
y <- c(2,2,2,3,3,3) 
a <- c(1,1,1,2,2,2) 
x <- data.frame(z,y,a) 
xx <- as.data.table(x) # Make a data.table object 
setkey(xx, z) # Make the z column a key 
xx[1, sum(a)] # Sum all values in column a where the key z = 1 
[1] 1 
# Now try the other sum you mention 
xx[, sum(z), by = list(z = y)] # A column sum over groups defined by z = y 
    z V1 
1: 2 2 
2: 3 3 
sum(xx[, sum(z), by = list(z = y)][, V1]) # Summing over the sums for each group should do it 
[1] 5 

Pour créer la somme sur la colonne a où z = 1, je pris la z colonne une clé. La syntaxe xx [1, sum (a)] somme a où la valeur de clé (valeur z) est 1.

Je peux créer des groupes avec l'objet data.table avec by, qui est analogue à une clause SQL WHERE si vous connaissez SQL. Cependant, le résultat est la somme de la colonne z pour chacun des groupes créés. Cela peut être inefficace si vous avez un grand nombre de valeurs de correspondance possibles où z = y. La somme externe ajoute les valeurs de chaque groupe dans la colonne V1 sous-sélectionnée du résultat interne.

Si vous utilisez sérieusement data.table, étudiez les vignettes informatives disponibles pour ce package.

M Dowle, T Court-métrage, S Lianoglou, A Srinivasan avec des contributions de R Saporta et E Antonyan (2014). data.table: Extensions de data.frame. R paquet version 1.9.2. http://CRAN.R-project.org/package=data.table