在dplyr中将字符串参数传递给函数作为数据框列名

3

我正在尝试将一个字符串变量传递给一个函数,用作一些数据修改后的列名。

这是该函数:

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)
}

我希望将一个字符串变量传递给“名称”,并将其作为列名。
该函数的当前输出为:
> 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个回答

3

您需要在此处使用gather_。请参见vignette('nse')以了解原因。

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

问题在于 gather 函数使用未加引号的名称作为其 keyvalue 列,因此您无法传递变量名。它将把您输入的任何变量名解释为您想要用作值列的未加引号名称。这与原则一致,即没有下划线的 tidyr 函数适用于交互式使用,而带有下划线的函数应在更具程序性的情况下使用。

太完美了!谢谢Matt。还要特别感谢你向我展示如何有效地使用grepl。(我爱互联网) - Rahul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接