NSE против SE в mutate_ - PullRequest
       15

NSE против SE в mutate_

0 голосов
/ 14 июня 2019

Я читал и читал, но я не могу понять это NSE против SE в R. Я надеюсь, что кто-то может объяснить это правильно.

df=data.frame(a=1:6,b=7:12,c=13:18,d=rep(c("a","b"),each=3))

Это то, к чему я привык, и это работает:

df %>% group_by(d) %>% mutate(new=sum(a))

Теперь я на новой территории, это работает, но выдает предупреждение. Может кто-нибудь объяснить мне, как мне это сделать, если не с group_by _?

var="d"
df %>% group_by_(`var`) %>% mutate(new=sum(a))

Предупреждение: group_by_ () устарела. Пожалуйста, используйте group_by () вместо

Теперь, на то, что я действительно пытаюсь сделать, это просто выдает ошибку:

var="d"
var2="a"
df %>% group_by_(`var`) %>% mutate_(new=sum(`var2`))

Ошибка в сумме (var2): неверный тип (символ) аргумента

Я действительно пытаюсь понять основы здесь ... спасибо!

1 Ответ

1 голос
/ 14 июня 2019

Книга по Tidy Evaluation - фантастический ресурс, чтобы узнать о NSE. Глава 8 может оказаться особенно полезным.

В вашем случае вам сначала нужно преобразовать строки символов в имена символических переменных:

s1 <- sym(var)
s2 <- sym(var2)

Если вы хотитеиспользуйте s1 и s2 непосредственно в dplyr, он попытается найти столбцы с именами s1 и s2 в вашем фрейме данных.Это не то, что вы хотите.Вместо этого вы хотите получить доступ к символам, хранящимся внутри переменных s1 и s2.Вы можете сделать это через оператор отмены цитирования !!:

df %>% group_by( !!s1 ) %>% mutate( new=sum(!!s2) )

## Or putting everything together
df %>% group_by( !!sym(var) ) %>% mutate( new=sum(!!sym(var2)) )
...