如何控制新变量';tidyr'后的名称;什么是传播?

如何控制新变量';tidyr'后的名称;什么是传播?,r,dplyr,tidyr,R,Dplyr,Tidyr,我有一个具有面板结构的数据框架:每台机组两年观察2次: library(tidyr) mydf%价差(年、值)%>%过滤器(2012年>0.5) 以下内容很有用,但不够简洁: tmp您可以对以数字开头的列名使用backticks,并且filter应按预期工作 mydf %>% spread(year, value) %>% filter(`2012` > 0.5) # id 2012 2013 #1 3 0.8453

我有一个具有面板结构的数据框架:每台机组两年观察2次:

library(tidyr)
mydf%价差(年、值)%>%过滤器(2012年>0.5)
以下内容很有用,但不够简洁:


tmp您可以对以数字开头的列名使用
backticks
,并且
filter
应按预期工作

  mydf %>%
      spread(year, value) %>%
      filter(`2012` > 0.5)
  #  id      2012      2013
  #1  3 0.8453762 0.3346603
或者另一个选项是在创建第二列“year1”和字符串“y”后,使用
unite
将两列连接到单个列n

  mydf %>%
     mutate(year1='y') %>%
     unite(yearN, year1, year) %>%
     spread(yearN, value) %>%
     filter(y_2012 > 0.5)
 #   id    y_2012    y_2013
 #1  3 0.8453762 0.3346603
甚至我们也可以使用
粘贴

 mydf %>%
     mutate(year=paste('y', year, sep="_")) %>%
     spread(year, value) %>%
     filter(y_2012 > 0.5)

另一个选项是使用
setNames()
函数作为管道中的下一个对象:

mydf %>%
    spread(mydf, year, value) %>%
    setNames( c("id", "y2012", "y2013") ) %>%
    filter(y2012 > 0.5)
使用集合名的唯一问题是,您必须确切地知道当您
spread()
列时,它们将是什么。大多数情况下,这不是问题,特别是如果您以半交互方式工作

但是,如果您的原始数据中缺少键/值对,则它可能不会显示为列,并且您可能会在不知道的情况下错误地命名列。诚然,如果名称数与列数不匹配,
setNames()
将抛出一个错误,因此内置了一些错误检查


尽管如此,对我来说,使用
setNames()
的便利性往往超过了风险。

我知道这个问题最初提出已经有几年了,但对于子孙后代,我还想强调
spread
sep
参数。当不
NULL
时,它将用作键名和值之间的分隔符:

mydf %>% 
 spread(key = year, value = value, sep = "")
#  id   year2012  year2013
#1  1 0.15608322 0.6886531
#2  2 0.04598124 0.0792947
#3  3 0.16835445 0.1744542
这并不完全符合问题的要求,但足以满足我的目的。请参见
?排列

使用tidyr 1.0.0更新:tidyr 1.0.0现在引入了
pivot\u加宽
(和
pivot\u加长
),允许在这方面对参数
names\u sep
names\u前缀
进行更多控制。因此,现在的要求是:

mydf %>% 
  pivot_wider(names_from = year, values_from = value,
              names_prefix = "year")
# # A tibble: 3 x 3
#        id year2012 year2013
#     <int>    <dbl>    <dbl>
#   1     1    0.347    0.388
#   2     2    0.565    0.924
#   3     3    0.406    0.296
dplyr中的rename()应该可以做到这一点

library(tidyr); library(dplyr)
mydf %>%
  spread(year,value)%>%
  rename(y2012 = '2012',y2013 = '2013')%>%
  filter(y2012>0.5)
使用
spread()
的后继者
pivot\u wider()
我们可以为创建的列提供前缀:

library(tidyr)
种子(1)
mydf#A tible:3 x 3
#>id y2012 y2013
#>     
#> 1     1 0.266 0.372
#> 2     2 0.573 0.908
#> 3     3 0.202 0.898

由(v0.3.0)于2019-09-14创建,在概念上与@crazybilly的答案相同这正是我们想要的:)“更改
排列中的新变量名
library(tidyr); library(dplyr)
mydf %>%
  spread(year,value)%>%
  rename(y2012 = '2012',y2013 = '2013')%>%
  filter(y2012>0.5)