R:tidyr :: spread的程序化替代方案?

时间:2017-08-22 10:03:37

标签: r dataframe tidyr

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

E.g。

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)

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

E.g。这不起作用:

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

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

2 个答案:

答案 0 :(得分:3)

我们可以使用spread_

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

答案 1 :(得分:3)

tidyr 0.7.0 开始,

spread_已弃用, 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