Dplyr: select_ не допускает пробелов в имени столбца, filter_, похоже, не работает

Созданный на 8 сент. 2015  ·  5Комментарии  ·  Источник: tidyverse/dplyr

Это две разные проблемы, но я думаю, что они могут иметь один и тот же базовый код, влияющий на них обоих. Во-первых, с select_ я не могу использовать пробелы в имени:

> mtcars_tbl <- tbl_df(mtcars)
> mtcars_tbl <- rename(mtcars_tbl, `miles per gallon` = mpg)
> select_(mtcars_tbl, "miles per gallon")

Error in parse(text = x) : <text>:1:7: unexpected symbol
1: miles per

То же самое, если я действительно использую переменную, как «задумано».

> tmp <- "miles per gallon"
> select_(mtcars_tbl, tmp)

Error in parse(text = x) : <text>:1:7: unexpected symbol
1: miles per

Итак, передаю ли я фактическую переменную со строкой в ​​ней, как я полагаю, было первоначальным намерением, или если мне просто нужен более чистый способ работы с пробелами, select_ все равно не работает. filter_ (и, предположительно, другие) также не работает:

> filter_(mtcars_tbl, "miles per gallon")
Error in parse(text = x) : <text>:1:7: unexpected symbol
1: miles per

Хорошо, теперь перейдем к проблеме 2:

filter_ , похоже, вообще не работает, даже если этот пробел не является проблемой. Например:

> filter_(mtcars_tbl, "cyl" > 4) %>% arrange(cyl) %>% head(2)
  miles per gallon cyl  disp hp drat   wt  qsec vs am gear carb
1             22.8   4 108.0 93 3.85 2.32 18.61  1  1    4    1
2             24.4   4 146.7 62 3.69 3.19 20.00  1  0    4    2

против

> filter(mtcars_tbl, cyl > 4) %>% arrange(cyl) %>% head(2)
  miles per gallon cyl disp  hp drat    wt  qsec vs am gear carb
1               21   6  160 110  3.9 2.620 16.46  0  1    4    4
2               21   6  160 110  3.9 2.875 17.02  0  1    4    4

Я поигрался с ним еще, глядя на dim() и т. Д. Совершенно ясно, что с filter_ ничего не происходит. : frowning:

Самый полезный комментарий

Для решения первой проблемы вам нужно:

tmp <- "miles per gallon"
select_(mtcars_tbl, as.name(tmp))

Все 5 Комментарий

Что касается проблемы 2, это ошибка пользователя. Вы можете использовать "cyl >4" или ~cyl > 4 , но здесь происходит следующее:

> "cyl" > 4
[1] TRUE

так что вы получите все данные обратно.

Для решения первой проблемы вам нужно:

tmp <- "miles per gallon"
select_(mtcars_tbl, as.name(tmp))

Ромен,

Спасибо, что уловили мою ошибку! Думаю, когда я увидел, что одна вещь не работает, я начал подозревать пакет больше, чем свой код.

Хэдли,

Спасибо за ваше решение. Это сработает в краткосрочной перспективе, но является ли это долгосрочным решением? В чем вред от автоматической обертывания всего "as.name" в "* _" разновидностях пакета? Это приводит к сбою чего-то еще где-то еще?

Как я уже упоминал, есть две причины использовать ароматы "* _":

  • чтобы избежать использования обратных кавычек или другого синтаксиса, которого я бы предпочел избежать. По общему признанию, это менее важная причина.
  • чтобы иметь возможность использовать имена как переменные, основная причина. Если «as.name» работает для одних конструкций имен переменных, а не для других, то это решение нежизнеспособно. Если он работает для всех конструкций имен переменных, то нельзя ли его просто использовать как часть * _ разновидностей функций и методов внутри самого dplyr?

Это фундаментальный выбор - должен ли "my weird variable" работать, или должен "starts_with('abc') работать. Я остановился на последнем, а менять уже поздно. as.name() говорит, что у вас есть имя переменной, что мне кажется довольно разумным.

Привет Хэдли,

Хорошо понял! Так что, к сожалению, неизбежны конфликты в том, как интерпретировать имена. Я понимаю это, так как это было отравой R на протяжении многих лет.

Думаю, я просто надеялся, что со всеми чудесными вещами, с которыми удалось справиться dplyr, tidyr, ggplot2 и т. Д., Несмотря на то, что я полагался на язык, который сделал некоторые плохие выборы под капотом, что, возможно, вы нашли какой-нибудь крутой волшебный способ чтобы решить и эту проблему.

Спасибо за ваш ответ и за все ваши замечательные пакеты!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги