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
我有 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