R удалить строки со значением 0 в столбце таблицы - PullRequest
0 голосов
/ 24 декабря 2018

Я написал функцию для одной из моих обычных задач.Я просто попытаюсь повторить мою проблему.Ниже приведен случайный пример того, как выглядят мои данные.Теперь это вывод функции dput (mydataframe)

structure(list(respid = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), ssd = c(0, 
225, 236, 0, 221, 0, 0, 269, 265, 0), tea = c(228, 0, 269, 0, 
258, 241, 0, 222, 0, 256), juice = c(0, 236, 0, 236, 236, 0, 
236, 225, 242, 296), vad = c(236, 235, 0, 235, 235, 0, 235, 258, 
0, 236), energy = c(0, 235, 236, 235, 0, 236, 235, 0, 236, 0)), .Names = c("respid", 
"ssd", "tea", "juice", "vad", "energy"), row.names = c(NA, -10L
), class = c("tbl_df", "tbl", "data.frame"))

. Теперь моя цель - написать функцию для фильтрации ненулевых строк в столбце ssd.Тогда это будет выглядеть так:

non-zero

Я написал следующую функцию в R

SoT <- function(df,key) {
  df2 <- df %>% dplyr::filter(key > 0)
  df3 <- janitor::adorn_totals(df2, where = "row")
  df4 <- tail(df3,1) %>% janitor::adorn_percentages(denominator = "row") %>% janitor::adorn_pct_formatting()
  return(df4)
}

Мой желаемый результат - это только процентсуммирования итогов столбца (после фильтрации по ssd> 0).В приведенной выше функции я просто даю функции 2 входа.1 - это датафрейм, а другое - «имя переменной», которое я хочу отфильтровать.Я вызываю функцию следующим образом:

SoT(df1, "ssd")

Мой желаемый результат на рисунке ниже - зеленый, но я получаю желтый.

enter image description here

Это означает, что «функция фильтра» в коде не работает.Но все работает нормально, если я использую его просто построчно, а не внутри функции.Любые предложения?

Я не удалил изображения (только для справки), но сделал данные и код воспроизводимыми в соответствии с предложением.

1 Ответ

0 голосов
/ 25 декабря 2018

Когда вы программируете с помощью dplyr, например, определяя key для фильтрации, вам необходимо уточнить, из какой среды вы хотите определить key.

https://dplyr.tidyverse.org/articles/programming.html

В этом случае, чтобы использовать key, который вы передаете в своей функции, вам необходимо выполнить два шага:

1) заключить в кавычки key аргумент, используя enquo()

2), заключите его в кавычки, используя !!

Вместе они сообщают dplyr, что вы хотите использовать key, который вы передали в функцию, иникаких других key, которые могут быть определены вне вашей функции.

SoT <- function(df,key) {
  key_quoted <- enquo(key)
  df2 <- df %>% dplyr::filter(!!key_quoted > 0)
  df3 <- janitor::adorn_totals(df2, where = "row")
  df4 <- tail(df3,1) %>% janitor::adorn_percentages(denominator = "row") %>% janitor::adorn_pct_formatting()
  return(df4)
}

SoT(df1, ssd)
# respid   ssd   tea juice   vad energy
# Total 28.0% 17.3% 21.6% 16.8%  16.3%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...