Argumen dari file .csv ke fungsi R tidak berfungsi.

Fungsi yang dicoba di bawah ini. Tetapi mendapat pesan kesalahan seperti di bawah ini.

> tf1= data.frame(y=c('price'),grp= c('stock'))
> 
> dat= data.frame(price=c(20,12,24,34,12,34,56,88), 
+                 stock=c('fb','fb','fb','fb','ms','ms','ms','ms'))
> 
> my_fun2 <- function(x, num_var, ...)    {
+   group_var <- enquos(...)
+   num_var <- enquo(num_var)
+   
+   x %>%
+     group_by(!!!group_var) %>%
+     mutate(avg = mean(!!num_var), n = n(), 
+            sd = sd(!!num_var), se = sd/sqrt(n))}
> 
> dat %>% my_fun2(tf1$y,tf1$grp)

price stock `tf1$grp`   avg     n    sd    se
  <dbl> <fct> <fct>     <dbl> <int> <dbl> <dbl>
1    20 fb    stock        NA     8    NA    NA
2    12 fb    stock        NA     8    NA    NA
3    24 fb    stock        NA     8    NA    NA
4    34 fb    stock        NA     8    NA    NA
5    12 ms    stock        NA     8    NA    NA
6    34 ms    stock        NA     8    NA    NA
7    56 ms    stock        NA     8    NA    NA
8    88 ms    stock        NA     8    NA    NA

Pesan peringatan:

1: Dalam mean.default(~tf1$y) : argumen tidak numerik atau logis: mengembalikan NA 2: Dalam var(if (is.vector(x) || is.factor(x)) x else as.double( x), na.rm = na.rm) : Memanggil var(x) pada faktor x tidak digunakan lagi dan akan menjadi kesalahan. Gunakan sesuatu seperti 'all(duplicated(x)[-1L])' untuk menguji vektor konstan.

1
kamal 13 Agustus 2019, 00:24

1 menjawab

Jawaban Terbaik

Beberapa masalah: Masalah pertama adalah dalam definisi bingkai data tf1, seperti yang saat ini diatur, Anda melewati faktor dan bukan string yang sebenarnya. Perlu menambahkan stringsAsFactors = FALSE ke baris itu.

Koreksi kedua, nilai dari tf1 sekarang adalah string yang menyertakan tanda kutip sehingga Anda tidak memerlukan fungsi enquo tetapi memerlukan fungsi parse_expr. Sekarang ini harus bekerja seperti yang diharapkan.

library(rlang)
library(dplyr)

tf1= data.frame(y=c('price'), grp= c('stock'), stringsAsFactors = FALSE)
dat= data.frame(price=c(20,12,24,34,12,34,56,88), 
                stock=c('fb','fb','fb','fb','ms','ms','ms','ms'))

my_fun2 <- function(x, num_var, group_var){
  group_var <- parse_expr(group_var)
  num_var <- parse_expr(num_var)

  x %>%
   group_by(!!group_var) %>%
   mutate(avg = mean(!!num_var), n = n(), sd = sd(!!num_var), se = sd/sqrt(n))
}

my_fun2(dat, tf1$y, tf1$grp)


# A tibble: 8 x 6
# Groups:   stock [2]
  price stock   avg     n    sd    se
  <dbl> <fct> <dbl> <int> <dbl> <dbl>
1    20 fb     22.5     4  9.15  4.57
2    12 fb     22.5     4  9.15  4.57
3    24 fb     22.5     4  9.15  4.57
4    34 fb     22.5     4  9.15  4.57
5    12 ms     47.5     4 32.4  16.2 
6    34 ms     47.5     4 32.4  16.2 
7    56 ms     47.5     4 32.4  16.2 
8    88 ms     47.5     4 32.4  16.2 

Melewati beberapa variabel pengelompokan Salah satu opsi untuk menerima beberapa variabel pengelompokan adalah dengan melewatkan vektor nama kolom. Ini memang berbeda dari pendekatan awal Anda menggunakan argumen .... Melewati vektor nama sangat menyederhanakan kode.

dat= data.frame(price=c(20,12,24,34,12,34,56,88),
                stock=c('fb','fb','fb','fb','ms','ms','ms','ms'),
                day=c("A", "B", "A", "B", "A", "B", "A", "B"))

#passing multiple items to the function
my_fun2 <- function(x, num_var, group_var){
  group_var <- parse_exprs(group_var)
  num_var <- parse_expr(num_var)

  x %>%
    group_by(!!!group_var) %>%
    mutate(avg = mean(!!num_var), n = n(), sd = sd(!!num_var), se = sd/sqrt(n))
}

grouping<- c('stock', 'day')
y <- c('price')

my_fun2(dat, y, grouping)
0
Dave2e 14 Agustus 2019, 02:44