如何控制新变量';tidyr'后的名称;什么是传播?
我有一个具有面板结构的数据框架:每台机组两年观察2次:如何控制新变量';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
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)