0
votes

Modification des valeurs dans un Dataframe R si la valeur de cette clé dans un autre plus petit Dataframe rencontre certaines conditions

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:

Entrée xxx

sortie xxx < / pré>

AVIS, toutes les valeurs où la lecture s'est terminée par négative, serait multipliée par -1.

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: xxx

Cependant, je reçois l'erreur

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 x doit être longueur 55 (le nombre de lignes) ou un, pas 0.

- Question générale -

Ê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.


2 commentaires

@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 est assez pratique pour cela.


3 Réponses :


1
votes

Nous pourrions utiliser une jointure xxx pré>

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))


0 commentaires

2
votes

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


0 commentaires

1
votes

Une idée semblable à @camille à base r serait de faire une jointure gauche sur FullRoutes avec endofroute , puis modifiez la valeur de x Basé sur le signe. xxx


0 commentaires