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 à :
Sur d_test, nous avons :
Notez que red
et orange
sont de nouvelles couleurs non définies précédemment, elles restent donc inchangées.
Je pense que je dois boucler d_test$piece
et 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
Vous pouvez coder une boucle while, dans ce cas-
df_test
(table de transaction) avec le suffixe 1
par 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.left_join
votre 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).coalesce
votre première colonne de table de transaction (résultée) avec la colonne nouvellement créée.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.
laisse moi dire quelques mots