【问题标题】:Pass a string argument to a function as dataframe column name in dplyr将字符串参数作为 dplyr 中的数据框列名传递给函数
【发布时间】:2016-02-19 19:27:21
【问题描述】:

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

函数如下:

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。我错过了什么?

提前致谢,

拉胡尔

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    你想在这里使用gather_。请参阅vignette('nse') 了解原因。

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

    问题是gather 为其keyvalue 列使用了不带引号的名称,因此您无法传入变量名称。它只是将您放在那里的任何变量名称解释为您想要的 value 列的未引用名称。这与没有下划线的 tidyr 函数用于交互使用的原则是一致的,当您的工作更加程序化时应该使用带有下划线的函数。

    【讨论】:

    • 这太完美了!谢谢马特。并特别感谢向我展示了如何有效地使用 grepl。 (我喜欢互联网)
    猜你喜欢
    • 2018-05-09
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多