gpt4 book ai didi

r - 排列()不识别列名参数

转载 作者:行者123 更新时间:2023-12-04 09:42:26 27 4
gpt4 key购买 nike

在 R 中,我使用 dplyr更具体地说 arrange() .
不知何故 arrange功能没有按预期工作。

在下面的示例中,我首先存储列的名称,然后将此变量作为参数传递给名为“my_function”的自定义函数。

target_column = 'mean_age'

# below the function
my_function <- function(target_column, number){
df <- read.csv('file.csv', stringsAsFactors=FALSE)
df <- df[, c(1,4,10)]
names(df) <- c('place','state','mean_age')
df1 <- df %>% group_by(state) %>% arrange(target_column)
df1 %>% summarise(rank = nth(target_column, number))
}

由于 arrange() 的输入而调用“my_function”时,R 返回错误:

"Error in arrange_impl(.data, dots) : incorrect size (1) at position 1, expecting : 4000"



当列名直接放入 arrange()时,而不是引用字符串的变量(如上面的示例),它确实接受参数。
df %>% group_by(state) %>% arrange(mean_age) 

如何以更好的方式将列名的参数传递给“my_function”,所以 arrange()会认吗?

最佳答案

您需要首先将字符串参数解析为 quosure,然后用 !! 取消引用它:

library(dplyr)
library(rlang)

target_column = 'mean_age'

my_function <- function(target_column, number){
target_quo = parse_quosure(target_column)

df <- read.csv('file.csv', stringsAsFactors=FALSE)
df <- df[, c(1,4,10)]
names(df) <- c('place','state','mean_age')
df1 <- df %>% group_by(state) %>% arrange(!!target_quo)
df1 %>% summarise(rank = nth(target_column, number))
}

my_function('mean_age', 10)

如果您想能够供应 target_column作为不带引号的列名,您可以使用 enquo反而:
my_function <- function(target_column, number){
target_quo = enquo(target_column)

df <- read.csv('file.csv', stringsAsFactors=FALSE)
df <- df[, c(1,4,10)]
names(df) <- c('place','state','mean_age')
df1 <- df %>% group_by(state) %>% arrange(!!target_quo)
df1 %>% summarise(rank = nth(target_column, number))
}

my_function(mean_age, 10)

注:

通常, enquo也适用于字符串参数,但 arrange本身不允许这样做,因此以下内容不适用于第二个示例:
my_function('mean_age', 10)

下面是一个玩具示例来演示我的意思,因为 OP 的问题是不可重现的:
library(dplyr)
library(rlang)

test_func = function(var){
var_quo = parse_quosure(var)
mtcars %>%
select(!!var_quo) %>%
arrange(!!var_quo)
}

test_func2 = function(var){
var_quo = enquo(var)
mtcars %>%
select(!!var_quo) %>%
arrange(!!var_quo)
}

结果:
> test_func("mpg") %>%
+ head()
mpg
1 10.4
2 10.4
3 13.3
4 14.3
5 14.7
6 15.0

> test_func2(mpg) %>%
+ head()
mpg
1 10.4
2 10.4
3 13.3
4 14.3
5 14.7
6 15.0

> test_func2("mpg") %>%
+ head()

Error in arrange_impl(.data, dots) : incorrect size (1) at position 1, expecting : 32

关于r - 排列()不识别列名参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47056091/

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