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はエラーを返します。
"arrange_impl(.data、dots)のエラー:位置1のサイズ(1)が正しくありません:4000が必要です"
列の名前が、arrange()
文字列を参照する変数(上記の例のように)ではなく、に直接入力されると、パラメーターを受け入れます。
df %>% group_by(state) %>% arrange(mean_age)
列名のパラメーターをより適切な方法で「my_function」に渡すと、それarrange()
が認識されますか?
最初に文字列引数を解析してクォージャーにし、次に!!
:で引用符を外す必要があります。
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
それ自体では許可されないため、2番目の例では以下は機能しません。
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()
アレンジ_impl(.data、dots)のエラー:位置1のサイズ(1)が正しくありません:32が必要です
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加