6

我有问题让 tidyr 的收集在它的标准评估版本收集工作:

require(tidyr)
require(dplyr)
require(lazyeval)

df = data.frame(varName=c(1,2))

收集作品:

df %>% gather(variable,value,varName)

但我希望能够在标准评估模式下从变量中获取名称 varName ,但似乎无法正确:

name='varName'
df %>% gather_("variable","value",interp(~v,v=name))
Error in match(x, y, 0L) : 'match' requires vector arguments

我也对以下内容感到困惑。

这按预期工作:

df %>% gather_("variable","value","varName")

下一行应该等同于最后一行(根据我对http://cran.r-project.org/web/packages/dplyr/vignettes/nse.html的理解),但不起作用:

df %>% gather_(~variable,~value,~varName)
Error in match(x, y, 0L) : 'match' requires vector arguments
4

2 回答 2

7

查看 的源代码tidyr:::gather_.data.frame,您可以看到它只是reshape2::melt. 因此,它仅适用于characternumeric论点。Acutally 以下(我认为这是一个错误)有效:

df %>% gather_("variable", "value", 1)

据我所知,nse小插图仅指代dplyr而不是指代tidyr

于 2015-04-13T12:30:03.170 回答
0

尽管已经回答了这个问题,但以下代码可用于定义键和值,以便在函数中更一般地收集目的,使用键和值的输入向量:

    data <- data.frame(a = runif(10), b = runif(10), c = runif(10))
    Key <- "ColId"
    Value <- "ColValue"

    data %>% gather(key = KeyTmp, value = ValTmp) %>% 
    rename_(.dots = setNames("KeyTmp", Key) ) %>% 
    rename_(.dots = setNames("ValTmp", Value) )
于 2017-01-10T08:53:12.447 回答