是否有函数可以获取“pivot_wider”生成的列名?

Is there a function to get the column names generated by `pivot_wider`?

提问人:TY Lim 提问时间:11/15/2023 最后编辑:user438383TY Lim 更新时间:11/15/2023 访问量:48

问:

我正在使用(可能)多个和列。生成的自动生成的列名适合我的目的。pivot_widernames_fromvalues_from

我的问题是,是否有独立的函数可以生成给定 and 列和原始 tibble 的结果列名向量?names_fromvalues_from

例如,如果我有 where has levels ,并且 ,则生成的列名将是 。有没有一种简单的方法可以只获得这些名字?names_from=grpgrpfoo, bar, bazvalues_from=c("X", "Y")X_foo, X_bar, X_baz, Y_foo, Y_bar, Y_baz

R 枢轴 整洁

评论


答:

0赞 Andre Wildberg 11/15/2023 #1

用于组合,然后按行使用expand.gridpaste

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"
1赞 Maël 11/15/2023 #2

没有独立的函数,但您可以创建一个,例如: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"

或者用:do.call

do.call(paste, c(expand.grid(c("X", "Y"), unique(df$grp)), sep = "_"))
#[1] "X_bar" "Y_bar" "X_baz" "Y_baz" "X_foo" "Y_foo"
0赞 Gregor Thomas 11/15/2023 #3

对于您的示例,您可以使用以下命令生成它们

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")