【问题标题】:How can tidyr spread function take variable as a select columntidyr 扩展函数如何将变量作为选择列
【发布时间】:2015-09-17 03:32:21
【问题描述】:

tidyr 的扩展函数只接受不带引号的列名。有没有办法可以传入包含列名的变量 例如

# example using gather()
library("tidyr")
dummy.data <- data.frame("a" = letters[1:25], "B" = LETTERS[1:5], "x" = c(1:25))
dummy.data
var = "x"
dummy.data %>% gather(key, value, var)

这会报错

Error: All select() inputs must resolve to integer column positions.
The following do not:
*  var

使用匹配函数解决,该函数给出所需的列位置

dummy.data %>% gather(key, value, match(var, names(.)))

但同样的方法不适用于扩展函数

dummy.data %>% spread(a, match(var, names(.)))
Error: Invalid column specification

收集和传播函数采用不同的列规范。 collect 需要一个列索引,而 spread 没有提到它想要什么

【问题讨论】:

  • 注意spread 只接受一个值列。如果你想传播多列,你应该将它们变异(粘贴)成一个,然后再传播。
  • 也许你想要spread_?不过,它需要字符串作为键和值列。

标签: r tidyr


【解决方案1】:

如果您想使用标准评估,您需要使用gather_spread_

这两个给出相同的结果

dummy.data %>% gather_("key", "value", var)
dummy.data %>% gather(key, value, match(var, names(.)))

这很有效:

dummy.data %>% spread_("a",var)
#   B  a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y
# 1 A  1 NA NA NA NA  6 NA NA NA NA 11 NA NA NA NA 16 NA NA NA NA 21 NA NA NA NA
# 2 B NA  2 NA NA NA NA  7 NA NA NA NA 12 NA NA NA NA 17 NA NA NA NA 22 NA NA NA
# 3 C NA NA  3 NA NA NA NA  8 NA NA NA NA 13 NA NA NA NA 18 NA NA NA NA 23 NA NA
# 4 D NA NA NA  4 NA NA NA NA  9 NA NA NA NA 14 NA NA NA NA 19 NA NA NA NA 24 NA
# 5 E NA NA NA NA  5 NA NA NA NA 10 NA NA NA NA 15 NA NA NA NA 20 NA NA NA NA 25

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 2016-12-02
    相关资源
    最近更新 更多