Не могу использовать переменные из нескольких слов в dplyr или я что-то упустил? - PullRequest
7 голосов
/ 05 мая 2019

Почему dplyr не нравится этот формат 'бета-линалоола' в моей функции по сравнению с бета-линалоолом?

Мне потребовалось несколько часов на устранение неполадок, чтобы выяснить, в чем проблема. Есть ли способ использовать данные, где переменные помечены как более чем одно слово, или я должен просто переместить все в формат типа beta.linalool?

Все, что я узнал, было от Программирование с помощью dplyr .

library(ggplot2)
library(readxl)
library(dplyr)
library(magrittr)

Data3<- read_excel("Desktop/Data3.xlsx")

Data3 %>% filter(Variety=="CS 420A"&`Red Blotch`=="-")%>% group_by(`Time Point`)%>%
  summarise(m=mean(`beta linalool`),SD=sd(`beta linalool`))
# A tibble: 4 x 3
  `Time Point`       m         SD
  <chr>           <dbl>      <dbl>
1 End          0.00300  0.000117  
2 Mid          0.00385  0.000353  
3 Must         0.000254 0.00000633
4 Start        0.000785 0.000283  

Теперь, когда я работаю в функции:

cwine<-function(df,v,rb,c){
  c<-enquo(c)
  df %>% filter(Variety==v&`Red Blotch`==rb)%>% 
    group_by(`Time Point`) %>%
    summarise_(m=mean(!!c),SD=sd(!!c)) %>% 
}
cwine(Data3,"CS 420A","-",'beta linalool')
# A tibble: 4 x 3
  `Time Point`     m    SD
  <chr>        <dbl> <dbl>
1 End             NA    NA
2 Mid             NA    NA
3 Must            NA    NA
4 Start           NA    NA
Warning messages:
1: In mean.default(~"beta linalool") :
  argument is not numeric or logical: returning NA #this statement is repeated 4 more times
5: In var(if (is.vector(x) || is.factor(x)) x else as.double(x), na.rm = na.rm) :
  NAs introduced by coercion #this statement is repeated 4 more times

Проблема заключается в том, что бета-линалоол обозначается как «бета-линалоол». Я понял это, попробовав эту методологию на наборе данных радужной оболочки и убедившись, что Petal.Length - это не «Ширина лепестка»:

my_function<-function(ds,x,y,c){
  c<-enquo(c)
  ds %>%filter(Sepal.Length>x&Sepal.Width<y) %>% 
    group_by(Species) %>% 
    summarise(m=mean(!!c),SD=sd(!!c))
}
my_function2(iris,5,4,Petal.Length)
# A tibble: 3 x 3
  Species        m    SD
  <fct>      <dbl> <dbl>
1 setosa      1.53 0.157
2 versicolor  4.32 0.423
3 virginica   5.57 0.536

На самом деле моя функция отлично работает с другой переменной:

> cwine(Data2,"CS 420A","-",nerol)
# A tibble: 4 x 3
  `Time Point`        m        SD
  <chr>           <dbl>     <dbl>
1 End          0.000453 0.0000338
2 Mid          0.000659 0.0000660
3 Must         0.000560 0.0000234
4 Start        0.000927 0.0000224

Является ли dplyr таким чувствительным или я что-то упустил?

1 Ответ

4 голосов
/ 05 мая 2019

Один из вариантов будет преобразовать его в sym бол и оценить его

library(tidyverse)
cwine <- function(df,v,rb,c){

  df %>% 
      filter(Variety==v & `Red Blotch` == rb)%>% 
      group_by(`Time Point`) %>%
       summarise(m = mean(!!rlang::sym(c)),
                 SD = sd(!! rlang::sym(c))) 
}

cwine(Data3,"CS 420A","-",'beta linalool')
# A tibble: 2 x 3
#  `Time Point`       m    SD
#         <int>   <dbl> <dbl>
#1            2 -2.11    2.23
#2            4  0.0171 NA  

Кроме того, если мы хотим передать его путем преобразования в выражение (enquo), это работает, когда мы передаем имя переменной с кавычками (обычно работает версия без кавычек, но здесь есть пробел между словами и для оценки это как есть, обратная цитата нужна)

cwine <- function(df,v,rb,c){
  c1 <- enquo(c)
  df %>% 
      filter(Variety==v & `Red Blotch` == rb)%>% 
      group_by(`Time Point`) %>%
       summarise(m = mean(!! c1 ),
                 SD = sd(!! c1)) 
}

cwine(Data3,"CS 420A","-",`beta linalool`)
# A tibble: 2 x 3
#   `Time Point`       m    SD
#         <int>   <dbl> <dbl>
#1            2 -2.11    2.23
#2            4  0.0171 NA   

Данные

set.seed(24)
Data3 <- tibble(Variety = sample(c("CS 420A", "CS 410A"), 20, replace = TRUE),
`Red Blotch` = sample(c("-", "+"), 20, replace = TRUE), 
`Time Point` = sample(1:4, 20, replace = TRUE),
`beta linalool` = rnorm(20))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...