如何从R中的另一个数据帧展平数据帧变量



我有两个数据帧。其中一个用作组定义(调色板(及其各自的块(颜色(。其中一些将由组合而成。另一方面,我有一个测试数据框架,它有不同的组组合(非严格意义上的调色板(,比如颜色+调色板。我想有一个最终的数据帧,所有非严格调色板与各自的作品(颜色(。


# 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

编辑:

我已经更改了数据帧示例。现在,d_create包含在:

  1. "蓝调"one_depth_group
  2. "Greens";one_depth_group
  3. "彩虹":(mix_group(simple+one_depth_group

在d_test上,我们有:

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

请注意,redorange是以前未定义的新颜色,因此它们保持不变。

我想我必须在d_test$piece上循环,并检查d_create$group上是否存在每个片段。如果它存在,扩展到他们相应的和平。如果没有,保持不变。

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

但我不想写每一个可能的循环,因为在现实世界中,未来的扁平化工作是不可预测的。也许使用while。有什么帮助吗?感谢

您可以编写while循环,在本例中为-

  • 首先将后缀为1df_test(事务表(的列名更改为d_create(主表(的相应列名,以便可以开始循环并定义终点
  • 在while循环的每次迭代中,left_join您的事务表和主表,这样您就可以在事务表中获得一个额外的列以及相应的层次结构级别(第一层次结构中的第一级(
  • coalesce之后,事务表的第一列(结果(带有新创建的列
  • 只有当主表中没有其他要匹配的值时,循环才会结束,即如果创建了新列,则只包含相同的值,而不包含额外的值

我希望我已经把逻辑讲清楚了。

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

最新更新