给出以下内容:
library(tidyverse)
my_tibble <- tibble(
var_1 = c("label_a", "label_b", "label_c"),
var_2 = c("another_x", "another_y", "another_z"),
result = list(
data.frame(x = 1, y = 2, z = 3),
data.frame(x = 4, y = 5, z = 6),
data.frame(x = 5, y = 10, z = 11)
)
)
my_tibble
# # A tibble: 3 x 3
# var_1 var_2 result
# <chr> <chr> <list>
# 1 label_a another_x <df[,3] [1 x 3]>
# 2 label_b another_y <df[,3] [1 x 3]>
# 3 label_c another_z <df[,3] [1 x 3]>
如果我们pull
的结果列表列,我们得到:
my_tibble %>% pull(result)
# [[1]]
# x y z
# 1 1 2 3
#
# [[2]]
# x y z
# 1 4 5 6
#
# [[3]]
# x y z
# 1 5 10 11
如何通过引用原始小标题中的多个列来设置此提取结果的名称(例如set_names()
)?就是说,我希望列表中没有引用未命名列表,而是具有引用小标题的名称,例如:
# $`label_a | another_x`
# x y z
# 1 1 2 3
#
# $`label_b | another_y`
# x y z
# 1 4 5 6
#
# $`label_c | another z`
# x y z
# 1 5 10 11
答案 0 :(得分:4)
以其他顺序执行吗?
> my_tibble %>%
mutate(result = set_names(result,paste(var_1,var_2,sep = " | "))) %>%
pull(result)
$`label_a | another_x`
x y z
1 1 2 3
$`label_b | another_y`
x y z
1 4 5 6
$`label_c | another_z`
x y z
1 5 10 11
答案 1 :(得分:2)
tibble
的最新版本具有功能enframe
和deframe
,尽管从v2.1.3开始,它们都说它们已经成熟。 deframe
在数据框中创建一个命名列表。它假定第一列是名称,第二列是值,所以只需为名称创建一列(我用tidyr::unite
)。
library(dplyr)
my_tibble %>%
tidyr::unite(key, var_1, var_2, sep = " | ") %>%
tibble::deframe()
#> $`label_a | another_x`
#> x y z
#> 1 1 2 3
#>
#> $`label_b | another_y`
#> x y z
#> 1 4 5 6
#>
#> $`label_c | another_z`
#> x y z
#> 1 5 10 11