R:tidyr::spread 的编程替代方案?

R: programmatic alternative for tidyr::spread?

我有 R data.frames 有不同数量的列。最后一列是数字,其余是字符串。我需要对它们进行排列,以便展开最后一个非数字列。困难在于我想以编程方式执行此操作,因为我不知道列名。

例如

df <- data.frame(varA = c("A1", "A1", "A2", "A2"),
                 varB = c("B1", "B2", "B1", "B2"),
                 val = c(1, 2, 3, 4))

我到达我想去的地方

tidyr::spread(df, varB, val)

但是当传播变量的名称未知时,我不知道如何实现这一点。

例如这行不通:

tidyr::spread(df, names(df)[ncol(df) - 1], val)

我已经尝试了 tidyverse 解决方案,但基础 R 对我来说同样适用。

我们可以使用spread_

tidyr::spread_(df, names(df)[ncol(df) - 1], "val")
#    varA B1 B2
#1   A1  1  2
#2   A2  3  4

spread_tidyr 0.7.0 开始被弃用,tidyr 中的编程已切换到整洁评估。有关更多背景信息,请参阅 this article

要在 spread 中使用字符串,您需要包 rlang 中的 sym 函数以及 !! 取消引用以进行计算.

spread(df, !!rlang::sym(names(df)[ncol(df) - 1]), val)

  varA B1 B2
1   A1  1  2
2   A2  3  4