我将
pivot_wider
与(可能)多个 names_from
和 values_from
列一起使用。自动生成的列名称非常适合我的目的。
我的问题是,是否有一个独立的函数可以在给定
names_from
和 values_from
列以及原始 tibble 的情况下生成结果列名称的向量?
例如,如果我有
names_from=grp
,其中 grp
具有级别 foo, bar, baz
和 values_from=c("X", "Y")
,则生成的列名称将为 X_foo, X_bar, X_baz, Y_foo, Y_bar, Y_baz
。有没有简单的方法来获取这些名称?
使用
expand.grid
进行组合,然后使用 paste
逐行
apply(expand.grid(c("X", "Y"), c("foo", "bar", "baz")), 1, paste, collapse="_")
[1] "X_foo" "Y_foo" "X_bar" "Y_bar" "X_baz" "Y_baz"
没有独立的功能,但您可以制作一个,例如与
interaction
:
f <- function(names_from, values_from){
suppressWarnings(levels(interaction(values_from, unique(names_from), sep = "_")))
}
df <- data.frame(
grp = rep(c("foo", "bar", "baz"), 5),
X = floor(runif(15) * 100),
Y = floor(runif(15) * 100)
)
f(df$grp, c("X", "Y"))
#[1] "X_bar" "Y_bar" "X_baz" "Y_baz" "X_foo" "Y_foo"
对于您的示例,您可以使用
生成它们outer(c("X", "Y"), c("foo", "bar", "baz"), paste, sep = "_") |>
t() |>
as.vector()
# [1] "X_foo" "X_bar" "X_baz" "Y_foo" "Y_bar" "Y_baz"
(当然你可以用
levels(your_data$grp)
来写出c("foo", "bar", "baz")
部分。)