如何展平来自 R 中另一个数据帧的数据帧变量
How to flatten dataframe variable from another dataframe in 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 包括:
- “布鲁斯”one_depth_group
- “绿党”one_depth_group
- “彩虹”:(mix_group)简单+one_depth_group
在 d_test 期间,我们有:
- “蓝调”:one_depth_group
- "Rainbow_plus": 简单+one_depth_group+mix_group
请注意,red
和 orange
是以前未定义的新颜色,因此它们保持不变。
我想我必须遍历 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 循环,在这种情况下-
- 先把后缀为
1
的df_test
(transactiontable)的列名改成d_create
(mastertable)对应的列名这样就可以开始循环,也可以定义结束点。
- 在 while 循环的每次迭代中,
left_join
您与主 table 的交易 table 以便您在交易 table 中获得一个额外的列以及相应的列层级(第一层中的第一层)。
- 在那之后
coalesce
您的第一列交易 table(结果)与新创建的列。
- 仅当主table没有更多值可匹配时,循环才会结束,即,如果创建的新列将仅包含相同的值而没有额外的值。
我希望我已经把逻辑说清楚了。
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
我有两个数据框。一个用作组定义(调色板)及其各自的部分(颜色)。其中一些将通过组合形成。另一方面,我有一个测试数据框,其中包含不同的组组合(非严格调色板),例如颜色 + 调色板。我想要一个最终数据框,所有非严格调色板及其各自的部分(颜色)。
# 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 包括:
- “布鲁斯”one_depth_group
- “绿党”one_depth_group
- “彩虹”:(mix_group)简单+one_depth_group
在 d_test 期间,我们有:
- “蓝调”:one_depth_group
- "Rainbow_plus": 简单+one_depth_group+mix_group
请注意,red
和 orange
是以前未定义的新颜色,因此它们保持不变。
我想我必须遍历 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 循环,在这种情况下-
- 先把后缀为
1
的df_test
(transactiontable)的列名改成d_create
(mastertable)对应的列名这样就可以开始循环,也可以定义结束点。 - 在 while 循环的每次迭代中,
left_join
您与主 table 的交易 table 以便您在交易 table 中获得一个额外的列以及相应的列层级(第一层中的第一层)。 - 在那之后
coalesce
您的第一列交易 table(结果)与新创建的列。 - 仅当主table没有更多值可匹配时,循环才会结束,即,如果创建的新列将仅包含相同的值而没有额外的值。
我希望我已经把逻辑说清楚了。
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