gpt4 book ai didi

r - 如何使用管道将数据帧列作为函数中的参数传递?

转载 作者:行者123 更新时间:2023-12-03 03:26:29 25 4
gpt4 key购买 nike

我正在摆弄 R 中的内置数据集economics,并且我正在尝试将数据帧列作为使用管道的函数中的参数传递( dplyr%>%)。但我遇到了一些看似奇怪的问题。不知何故,我无法成功地将列名作为参数传递给函数 top_n()在我的自定义函数中。以下是我如何在没有自定义函数的情况下对人口最多的 5 个国家/地区进行子集划分:

代码 1:

library(dplyr)

df_econ <- economics
df_top_5 <- df_econ %>% top_n(5, pop)
df_top_5

输出 1:

2014-12-01  12122.0 320201  5.0 12.6    8688
2015-01-01 12080.8 320367 5.5 13.4 8979
2015-02-01 12095.9 320534 5.7 13.1 8705
2015-03-01 12161.5 320707 5.2 12.2 8575
2015-04-01 12158.9 320887 5.6 11.7 8549

包装到自定义函数中,它可能如下所示:

代码2:

library(dplyr)

# data
data(economics)
df_econ <- economics

# custom function
fxtop <- function(df, number, column){

tops <- df %>% top_n(number, column)
return(tops)
}

# build a df using custom function
df_top_5 <- fxtop(df=df_econ, number=5, column='pop')
df_top_5

输出 2:

1967-07-01  507.4   198712  12.5    4.5 2944
1967-08-01 510.5 198911 12.5 4.7 2945
1967-09-01 516.3 199113 11.7 4.6 2958
1967-10-01 512.9 199311 12.5 4.9 3143
1967-11-01 518.1 199498 12.5 4.7 3066
1967-12-01 525.8 199657 12.1 4.8 3018
1968-01-01 531.5 199808 11.7 5.1 2878
1968-02-01 534.2 199920 12.2 4.5 3001
1968-03-01 544.9 200056 11.6 4.1 2877
1968-04-01 544.6 200208 12.2 4.6 2709

此输出有 10 行,而不是预期的 5 行。我怀疑参数 number=5 被简单地忽略,实际使用的数字默认为 10。数据似乎也没有按 'pop' 排序。

到目前为止我尝试过的:

尝试 1:在自定义函数中硬编码 popnumber:

library(dplyr)

# data
data(economics)
df_econ <- economics

# custom function
fxtop <- function(df, number, column){

tops <- df %>% top_n(5, pop)
return(tops)
}

# build a df using custom function
df_top_5 <- fxtop(df=df_econ, number=5, column='pop')
df_top_5

尝试 1:输出:

2014-12-01  12122.0 320201  5.0 12.6    8688
2015-01-01 12080.8 320367 5.5 13.4 8979
2015-02-01 12095.9 320534 5.7 13.1 8705
2015-03-01 12161.5 320707 5.2 12.2 8575
2015-04-01 12158.9 320887 5.6 11.7 8549

尝试 1:评论

这就是所需的输出!

让我们看看当我通过函数传递变量时会发生什么

尝试 2:将变量作为对象而不是字符串传递:

library(dplyr)

# data
data(economics)
df_econ <- economics

# custom function
fxtop <- function(df, number, column){

tops <- df %>% top_n(5, column)
return(tops)
}

# build a df using custom function
df_top_5 <- fxtop(df=df_econ, number=5, column='pop')
df_top_5

尝试 2:输出:

现在的输出与第一个示例中的相同。这两个变量似乎都被忽略了。

那么,有什么建议吗?

最佳答案

我们可以使用 curly-curly 的非标准评估 ({{}})

library(dplyr)
library(rlang)

fxtop <- function(df, number, column){
tops <- df %>% top_n(number, {{column}})
return(tops)
}

并传递不带引号的变量名称

fxtop(df=df_econ, number=5, pop)

# date pce pop psavert uempmed unemploy
# <date> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 2014-12-01 12062 319746. 7.6 12.9 8717
#2 2015-01-01 12046 319929. 7.7 13.2 8903
#3 2015-02-01 12082. 320075. 7.9 12.9 8610
#4 2015-03-01 12158. 320231. 7.4 12 8504
#5 2015-04-01 12194. 320402. 7.6 11.5 8526
<小时/>

如果您想将列名作为字符串(带引号)传递,我们可以使用 sym!!

fxtop <- function(df, number, column){
tops <- df %>% top_n(number, !!sym(column))
return(tops)
}
fxtop(df=df_econ, number=5, 'pop')

关于r - 如何使用管道将数据帧列作为函数中的参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59767759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com