J'ai deux cadres de données de tailles différentes dans R.
Un, FullRoutes, contient des valeurs Play_Keys et X et Y qui représentent un mouvement au fil du temps pour une pièce de théâtre. L'autre, endofroute, a play_keys et les valeurs x et y finales pour cette pièce (celle-ci est beaucoup plus petite car elle a une ligne pour chaque jeu, alors que l'autre a des rangées pour chaque seconde de la pièce). Par exemple: P>
Entrée forte> p> AVIS, toutes les valeurs où la lecture s'est terminée par négative, serait multipliée par -1. p> si la valeur x dans endofroute est négative pour la clé en pleine définition, je veux changer tout X VALEURS EN FORPORTES AVEC CETTE clé À -X. Mon code pour faire ceci est: p> Cependant, je reçois l'erreur p> La longueur de l'objet plus longue n'est pas un multiple de longueur de longueur de l'objet plus courte de longueur d'objet n'est pas un multiple de longueur d'objet plus courteError à MutaT_Impl (.Data, points):
Colonne - Question générale - P> Êtes-vous en mesure de modifier de manière conditionnelle les valeurs dans un cadre de données plus grand en fonction des valeurs de clé dans un cadre de données plus petit? J'avais vu d'autres messages où cela fonctionne pour les données de données de la même taille, mais pas des éléments où plusieurs rangées dans un fichier de données accèdent à la même ligne d'une autre. P> p>
x code> doit être longueur 55 (le nombre de lignes) ou un, pas 0. p>
BlockQuote>
3 Réponses :
Nous pourrions utiliser une jointure ou utiliser signe code> p>
fullRoutes <- structure(list(key = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L,
3L, 3L), time = c(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.1, 0.2, 0.3,
0.1, 0.2, 0.3), x = c(0.2, 0.7, 0.9, 0.5, -0.2, -1, 0.2, 0.4,
0.5, 0, -0.5, -2)), class = "data.frame", row.names = c(NA, -12L
))
endOfRoutes <-structure(list(key = 1:3, x = c(-1, 0.5, -2)),
class = "data.frame", row.names = c(NA,
-3L))
C'est une bonne affaire de jointure, car le nombre de lignes n'aura pas d'importance. Inscrivez-vous par clé, à l'aide d'une jointure à gauche pour vous assurer que vous ne perdez pas d'observations dans FullRoutes code>. Je renommer la colonne
endofroute code> s code> x code> de l'autre trame de données
x code>. Convertissez le multiplicateur en -1 ou 1, multiplier et déposez la colonne multiplicateur.
library(dplyr)
fullRoutes %>%
left_join(endOfRoutes %>% rename(multiplier = x),
by = "key") %>%
mutate(multiplier = sign(multiplier),
x = x * multiplier) %>%
select(-multiplier)
#> # A tibble: 12 x 3
#> key time x
#> <dbl> <dbl> <dbl>
#> 1 1 0.1 -0.2
#> 2 1 0.2 -0.7
#> 3 1 0.3 -0.9
#> 4 1 0.4 -0.5
#> 5 1 0.5 0.2
#> 6 1 0.6 1
#> 7 2 0.1 0.2
#> 8 2 0.2 0.4
#> 9 2 0.3 0.5
#> 10 3 0.1 0
#> 11 3 0.2 0.5
#> 12 3 0.3 2
Une idée semblable à @camille à base r serait de faire une jointure gauche sur FullRoutes code> avec
endofroute code>, puis modifiez la valeur de
x code > Basé sur le signe.
@akrun ajouté! Faites-moi savoir si plus de clarté est nécessaire.
On sonne comme une table de recherche pourrait être utile. Seriez-vous capable de poster vos données de manière conviviale afin que nous ayons juste de la copier-la coller? Par exemple,
dput code> est assez pratique pour cela.