在R中编写一个使用Tidyr的“聚集”功能将类似的数据帧转换为长格式的函数时出现问题

时间:2019-04-28 13:01:44

标签: r function tidyr

我正在尝试编写一个函数,该函数使用tidyr的聚集,并且可以用于将多个相似的数据帧转换为长格式。我已经编写了一个可以成功转换为长格式的基本函数,但是我也希望该函数命名为“值”列,这是我遇到的困难。

我已经在互联网上搜索了一段时间,但由于收集本身是一项功能,因此我每次使用“ write function ...”和“ gather”的某种变体进行搜索时,只会导致我转到显示如何使用的页面该功能聚集在提迪尔。我知道如何使用收集。我想做的是在单独的函数中使用“聚集”。

这是一些示例代码:

df <- data.frame(Country = c("Afghanistan", "Angola", "Albania"),
                 Indicator = "emissions",
                 '1960' = rnorm(3, mean = 0.5, sd =1),
                 '1961' = rnorm(3, mean = 0.5, sd =1),
                 '1962' = rnorm(3, mean = 0.5, sd =1))

colnames(df) <- c("Country", "Indicator", "1960", "1961", "1962")

是的,我有意将最后三列的名称更改为年份,但将数据类型字符更改为年份。我正在使用的数据(来自世界银行数据库)就是这样。

这是功能:

convert_to_longform <- function(df_name1, value_name1, year1, year2) {
  gather(df_name1, key = Year, value = value_name1, c(year1:year2))

}

df_lf <- convert_to_longform(df, emissions, "1960", "1962")

因此此函数有效,但是如您所见,当我希望列名称为“排放”时,值列的列名称变为“ value_name1”。有没有一种方法可以在单独的函数中使用collect来设置value列的名称?

我的预期结果是一个长格式数据框,其中value列是“ emissions”或我指定的其他一些字符串,而不是value_name1。

1 个答案:

答案 0 :(得分:0)

如果用!!取消引号,则可以指定值列的名称:

(请参阅Quasiquotation of an expression上的文档)

convert_to_longform <- function(df_name1, value_name1, year1, year2) {
 gather(df_name1, key = Year, value = !!value_name1, c(year1:year2))
}

convert_to_longform(df, "emissions", "1960", "1962")



#        Country Indicator Year   emissions
#  1 Afghanistan emissions 1960  0.68329845
#  2      Angola emissions 1960  0.13857468
# ...