在dplyr

时间:2016-02-19 19:27:22

标签: r dplyr

我正在尝试将字符串变量传递给函数,以便在进行某些数据更改后用作列名。

这是功能:

cleandata <- function(df,name){
  df <- df %>%
    gather(key = 'Year',value = name,X1960:X2015)
  df <- df %>%
    select(-c(X,Indicator.Name,Indicator.Code))
  df$Year <- substr(df$Year,start = 2,stop = 5)
  df$Year <-  as.factor(df$Year)
  return(df)
}

我想将字符串变量传递给'name',并将其作为列名称。

该功能的当前输出是:

> cleandata(lifeexp,'LifeExp')
Source: local data frame [13,888 x 4]

           Country.Name Country.Code   Year     name
                 (fctr)       (fctr) (fctr)    (dbl)
1                 Aruba          ABW   1960 65.56937
2               Andorra          AND   1960       NA
3           Afghanistan          AFG   1960 32.32851
4                Angola          AGO   1960 32.98483
5               Albania          ALB   1960 62.25437
6            Arab World          ARB   1960 46.84706
7  United Arab Emirates          ARE   1960 52.24322
8             Argentina          ARG   1960 65.21554
9               Armenia          ARM   1960 65.86346
10       American Samoa          ASM   1960       NA
..                  ...          ...    ...      ...
> 

最后一列应该是'LifeExp',而不是 name 。我错过了什么?

提前致谢,

的Rahul

1 个答案:

答案 0 :(得分:3)

您想在此处使用gather_。有关原因,请参阅vignette('nse')

year_cols <- names(df)[grepl('^X\\d{4}$', names(df))]
df %>% gather_('Year', name, year_cols)

问题是gather对其keyvalue列采用了不带引号的名称,因此您无法传递变量名称。它只是将您放在那里的变量名称解释为您想要的值列的不带引号的名称。这与以下原则一致:没有下划线的 tidyr 函数用于交互式使用,当您的工作更具编程性时,应使用带下划线的函数。