Comment aplatir une variable de trame de données à partir d'une autre trame de données dans R

Archymède

J'ai deux blocs de données. L'un est utilisé comme définition de groupe (palette) avec leurs pièces respectives (couleurs). Certains d'entre eux seraient formés par des combinaisons. D'un autre côté, j'ai un bloc de données de test avec différentes combinaisons de groupes (pas strictement palette), comme couleur + palette. J'aimerais avoir une trame de données finale, avec toutes les palettes non strictement avec leurs pièces respectives (couleurs).


# Definition dataframe ----

n = 3

Blues   = paste0('blue',  seq_len(n))
Greens  = paste0('green', seq_len(n))
Rainbow = c('red', 'Greens')

d_create = data.frame(
  group = c(
    rep(c('Blues', 'Greens'), each = n),
    rep('Rainbow', 2)
  ),
  piece = c(Blues, Greens, Rainbow)
)

d_create

#     group  piece
# 1   Blues  blue1
# 2   Blues  blue2
# 3   Blues  blue3
# 4  Greens green1
# 5  Greens green2
# 6  Greens green3
# 7 Rainbow    red
# 8 Rainbow Greens

# Test dataframe ----

Rainbow_plus = c('orange', 'Blues', 'Rainbow')

d_test = data.frame(
  group = c(
    rep('Blues',        length(Blues)),
    rep('Rainbow_plus', length(Rainbow_plus))
  ),
  piece = c(Blues, Rainbow_plus)
)

d_test

#          group   piece
# 1        Blues   blue1
# 2        Blues   blue2
# 3        Blues   blue3
# 4 Rainbow_plus  orange
# 5 Rainbow_plus   Blues
# 6 Rainbow_plus Rainbow

# Desired dataframe ----

d_desired = data.frame(
  group = c(
    rep('Blues', n),
    rep('Rainbow_plus', (2*n+2))
  ),
  piece = c(
    Blues,
    c('orange', Blues, 'red', Greens)
  )
)

d_desired

#           group  piece
# 1         Blues  blue1
# 2         Blues  blue2
# 3         Blues  blue3
# 4  Rainbow_plus orange
# 5  Rainbow_plus  blue1
# 6  Rainbow_plus  blue2
# 7  Rainbow_plus  blue3
# 8  Rainbow_plus    red
# 9  Rainbow_plus green1
# 10 Rainbow_plus green2
# 11 Rainbow_plus green3

ÉDITÉ:

J'ai modifié les exemples de trames de données. Maintenant, d_create consiste à :

  1. "Blues" one_depth_group
  2. "Verts" one_depth_group
  3. "Rainbow": (mix_group) simple+one_depth_group

Sur d_test, nous avons :

  1. "Blues": one_depth_group
  2. "Rainbow_plus": simple+one_depth_group+mix_group

Notez que redet orangesont de nouvelles couleurs non définies précédemment, elles restent donc inchangées.

Je pense que je dois boucler d_test$pieceet vérifier si chaque pièce est présente dessus d_create$group. S'il est présent, étendez-vous à leurs paix correspondantes. Sinon, restez inchangé.

lapply(d_test$piece, function(x) {
    check1 = x %in% d_create$group
    if (!check1) {
      x
    } else {
      lapply(d_test[d_test$group == x,]$piece, function(z){
        check2 = z %in% d_create$group
        if (!check2) {
          z
        } else {
          lapply(d_test[d_test$group == z, ]$piece, function(m){
            check3 = m %in% d_create$group
            if (!check3) {
              m
            } else {
              'infinite_loop'
            }
          })
        }
      })
    }

  })

Mais je ne veux pas écrire chaque boucle possible, car dans le monde réel, ce serait imprévisible pour le futur travail d'aplatissement. Peut-être en utilisant while. De l'aide? Merci

AnilGoyal

Vous pouvez coder une boucle while, dans ce cas-

  • Remplacez d'abord le nom de colonne de df_test(table de transaction) avec le suffixe 1par le nom de colonne correspondant de d_create(table principale) afin que la boucle puisse être démarrée et que le point final puisse également être défini.
  • À chaque itération de la boucle while, left_joinvotre table de transaction avec la table principale afin que vous obteniez une colonne supplémentaire dans votre table de transaction avec le niveau de hiérarchie respectif (premier niveau de la première hiérarchie).
  • Après cela, coalescevotre première colonne de table de transaction (résultée) avec la colonne nouvellement créée.
  • La boucle ne se terminera que lorsqu'il n'y aura plus de valeurs à faire correspondre à partir de la table principale, c'est-à-dire que la nouvelle colonne, si elle est créée, ne contiendra que les mêmes valeurs et aucune valeur supplémentaire.

J'espère avoir rendu la logique assez claire.

library(dplyr)

#rename one column of d_test
d_test <- d_test %>% rename(piece1 = piece)

#actual while loop
j = 1
while(any(d_test[,(paste0('piece',j))] %in% d_create$group)){
  d_test %>% left_join(d_create, by = c('piece1' = 'group')) %>%
    rename(!!paste0('piece', j +1) := piece) %>%
    mutate(piece1 = coalesce(get(paste0('piece', j+1)), piece1)) -> d_test
  j = j +1
}

#desired output
d_test %>% select(group, piece1)

          group piece1
1         Blues  blue1
2         Blues  blue2
3         Blues  blue3
4  Rainbow_plus orange
5  Rainbow_plus  blue1
6  Rainbow_plus  blue2
7  Rainbow_plus  blue3
8  Rainbow_plus    red
9  Rainbow_plus green1
10 Rainbow_plus green2
11 Rainbow_plus green3

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

Comment extraire une trame de données d'une autre trame de données dans R

Comment créer une colonne dans une trame de données calculée à partir d'une autre trame de données dans R?

Ajouter des lignes manquantes à la trame de données à partir d'une autre trame de données dans R

Mappage de valeurs à une trame de données à partir d'une autre trame de données dans Pandas

Filtrer une trame de données à partir d'informations dans une autre trame de données à l'aide de Pandas

Comment calculer la proportion de variable dans une trame de données en fonction des données d'une autre trame de données

comment créer plusieurs trames de données à partir d'une autre trame de données dans une boucle

Comment créer une trame de données transposée à partir d'une autre trame de données

Extraction de la trame de données pandas à partir d'une autre trame de données

Créer une trame de données simulée dans dplyr à partir d'une autre trame de données

Tranche d'une trame de données dans une autre trame de données

Copier des parties d'une trame de données dans une autre trame de données

Mettre à jour la trame de données à partir d'une autre trame de données

Ajouter de la valeur d'une trame de données à une autre trame de données dans R

Comment utiliser les valeurs d'une trame de données pour informer une fonction de sommation dans une autre trame de données dans R?

Comment indexer dans une trame de données en utilisant les indices d'une autre trame de données ?

Comment créer une trame de données à une ligne à partir d'un vecteur dans R ?

comment créer une trame de données à partir d'une liste imbriquée dans R?

fréquence de comptage d'une variable dépendante d'une autre variable dans une trame de données R

Les pandas remplissent les valeurs manquantes dans la trame de données à partir d'une autre trame de données

Existe-t-il un moyen dans R de mettre à jour une trame de données à partir d'une autre trame de données ?

Mappage à partir d'une autre trame de données

Comment puis-je créer une colonne dans une trame de données réelle en indexant une autre trame de données à l'aide des valeurs de deux colonnes à partir de la trame de données réelle

Comment faire des calculs sur une colonne d'une trame de données en utilisant des valeurs contenues dans une autre trame de données dans R ?

mettre à jour une valeur de colonne dans une trame de données à partir d'une autre colonne correspondante dans une autre trame de données dans Pandas

R - Comment créer une trame de données à partir d'une trame de données avec des conditions?

Comment remplir une colonne dans une trame de données à partir de la valeur tronquée d'une autre colonne

muter une trame de données en utilisant les valeurs d'une autre trame de données comme noms de variable dans R

Comment soustraire un enregistrement d'une autre trame de données dans R

TOP liste

  1. 1

    Microsoft.WebApplication.targets

  2. 2

    Exporter la table de l'arborescence vers CSV avec mise en forme

  3. 3

    Spring @RequestParam DateTime format comme ISO 8601 Date Heure facultative

  4. 4

    Comment analyser un hachage Ruby plat en un hachage imbriqué?

  5. 5

    Passer la taille d'un tableau 2D à une fonction ?

  6. 6

    Comment créer une nouvelle application dans Dropbox avec des autorisations complètes

  7. 7

    Algorithme: diviser de manière optimale une chaîne en 3 sous-chaînes

  8. 8

    Laravel SQLSTATE [HY000] [1049] Base de données inconnue 'previous_db_name'

  9. 9

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  10. 10

    php ajouter et fusionner des données de deux tables

  11. 11

    Créer un système Buzzer à l'aide de python

  12. 12

    Existe-t-il un moyen de voir si mon bot est hors ligne ?

  13. 13

    Comment changer la couleur de la police dans R?

  14. 14

    Déplacement des moindres carrés d'ajustement pour les déplacements de points ayant des problèmes

  15. 15

    impossible d'obtenir l'image d'arrière-plan en plein écran dans reactjs

  16. 16

    Comment vérifier si un utilisateur spécifique a un rôle? Discord js

  17. 17

    comment afficher un bouton au-dessus d'un autre élément ?

  18. 18

    Comment choisir le nombre de fragments et de répliques Elasticsearch

  19. 19

    Comment ajouter une entrée à une table de base de données pour une combinaison de deux tables

  20. 20

    optimiser les opérations du serveur avec elasticsearch: traitement des filigranes de disque bas

  21. 21

    Comment analyser un fichier avec un tableau d'objets JSON en utilisant Node.js?

chaudétiquette

Archive