如何在tidyr中使用gather_和变量?

4

我正在使用tidyr和shiny,因此需要在tidyr操作中利用动态值。 然而,我在使用gather_()时遇到了困难,我认为它是为这种情况设计的。 下面是一个最简示例:

library(tidyr)

df <- data.frame(name=letters[1:5],v1=1:5,v2=10:14,v3=7:11,stringsAsFactors=FALSE)
#works fine
df %>% gather(Measure,Qty,v1:v3)

dyn_1 <- 'Measure'
dyn_2 <- 'Qty'
dyn_err <- 'v1:v3'
dyn_err_1 <- 'v1'
dyn_err_2 <- 'v2'
#error
df %>% gather_(dyn_1,dyn_2,dyn_err)
#error
df %>% gather_(dyn_1,dyn_2,dyn_err_1:dyn_err_2)

经过一些调试,我意识到错误发生在melt measure.vars部分,但我不知道如何在那里使用“:”来解决它...请提供一个解决方案并简要说明,以便我能学到更多。

在一些调试后,我意识到错误发生在melt measure.vars这一部分,但是我不知道如何在那里使用“:”来解决它。请提供一个解决方案,并简单解释一下,这样我就可以学到更多。


没有关于 gather_() 和 gather() 的讨论吗? - Shicheng Guo
1个回答

4
你正在告诉 gather_ 查找列名为'v1:v3'的列,而不是分别查找这三个列id。只需将dyn_err <- "v1:v3"更改为dyn_err <- paste("v", seq(3), sep="")
如果你的 df 有不同的列名(例如 var_a,qtr_b,stg_c),你可以提取这些列名或对任何感兴趣的变量使用 paste 函数。
dyn_err <- colnames(df)[2:4]

或者

dyn_err <- paste(c("var", "qtr", "stg"), letters[1:3], sep="_")

您需要查看您想要的列名称,并创建相应的向量。


1
嗨,再次感谢您的帮助。如果列不是v1:v3,而是一些随机名称,例如'var_a'、'qtr_b'、'length_c',该怎么办?它们是有序的,但我想要从var_a到length_c。 - Xiushi Le
@XiushiLe,上述编辑是否有助于澄清如何针对几乎任何列名执行此操作? - cdeterman
是的,它有帮助。我想我之前对R中“:”的含义解释不够清楚。我的理解是从startcol到endcol,r会通过查看names(df)自动填充其余部分。我试图允许用户输入起始列,并将起始列和最后一列之间的任何列转换。我认为dyn_err <- colnames(df)[2:4] 对我来说已经足够好了。 - Xiushi Le

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接