Использование lapply в group_by () двух факторов в R - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть этот фрейм данных (названный OEM_final). Это структура:

str(OEM_final)
'data.frame':   2265 obs. of  17 variables:
 $ dia_hora_OEM : POSIXct, format: "2019-12-31 06:40:13" "2019-12-31 06:43:00" "2019-12-31 07:11:30" "2019-12-31 07:18:30" ...
 $ coche_OEM    : Factor w/ 6 levels "356232050832996",..: 3 3 3 3 3 3 3 3 6 6 ...
 $ DTC_OEM_dec64: chr  "[{\"code\":\"B1182\",\"description\":\"Tire pressure monitor module\",\"faultInformations\":[{\"description\":\"| __truncated__ "[{\"code\":\"B1182\",\"description\":\"Tire pressure monitor module\",\"faultInformations\":[{\"description\":\"| __truncated__ "[{\"code\":\"B1182\",\"description\":\"Tire pressure monitor module\",\"faultInformations\":[{\"description\":\"| __truncated__ "[{\"code\":\"B1182\",\"description\":\"Tire pressure monitor module\",\"faultInformations\":[{\"description\":\"| __truncated__ ...
 $ rowname      : Factor w/ 2265 levels "1","10","100",..: 1 1112 1489 1600 1711 1822 1933 2044 2155 2 ...
 $ B1182        : Factor w/ 2 levels "B1182","NULL": 1 1 1 1 1 1 1 1 2 2 ...
 $ B124D        : Factor w/ 2 levels "B124D","NULL": 1 1 1 1 1 1 1 1 2 2 ...
 $ NA.          : Factor w/ 6 levels "c(NA, NA, NA, NA, NA, NA, NA, NA)",..: 3 3 3 3 3 3 3 3 1 1 ...
 $ P2000        : Factor w/ 2 levels "c(\"P2000\", \"P2000\", \"P2000\")",..: 2 2 2 2 2 2 2 2 2 2 ...
 $ U3003        : Factor w/ 2 levels "NULL","U3003": 1 1 1 1 1 1 1 1 1 1 ...
 $ B1D01        : Factor w/ 3 levels "B1D01","c(\"B1D01\", \"B1D01\")",..: 3 3 3 3 3 3 3 3 3 3 ...
 $ U0155        : Factor w/ 2 levels "NULL","U0155": 1 1 1 1 1 1 1 1 1 1 ...
 $ C1B00        : Factor w/ 2 levels "C1B00","NULL": 2 2 2 2 2 2 2 2 2 2 ...
 $ P037D        : Factor w/ 2 levels "NULL","P037D": 1 1 1 1 1 1 1 1 1 1 ...
 $ P0616        : Factor w/ 2 levels "NULL","P0616": 1 1 1 1 1 1 1 1 1 1 ...
 $ P0562        : Factor w/ 2 levels "NULL","P0562": 1 1 1 1 1 1 1 1 1 1 ...
 $ U0073        : Factor w/ 2 levels "NULL","U0073": 1 1 1 1 1 1 1 1 1 1 ...
 $ P0138        : Factor w/ 2 levels "c(\"P0138\", \"P0138\", \"P0138\")",..: 2 2 2 2 2 2 2 2 2 2 ...

Я хотел бы рассчитать более раннюю дату (dia_hora_OEM), которая появляется при группировании по двум факторам. Два фактора:

  • Один из этих факторов, который является общим для всех возможных комбинаций, равен coche_OEM.
  • Другой - один из столбца 8 (P2000) до последнего (P0138), по одному за раз.

Итак, group_by() будет:

  • group_by(coche_OEM, P2000)
  • group_by(coche_OEM, U3003)
  • group_by(coche_OEM, B1D01)
  • group_by(coche_OEM, U0155)
  • ...

Я пробовал разные способы выполнения sh this:

Использование for циклов:

for (DTC in c(U3003, P2000)) {
  OEM_final %>%
  group_by(DTC, coche_OEM) %>%
  filter(dia_hora_OEM == min(dia_hora_OEM))
}

Но я получаю сообщение об ошибке:

Error in c(U3003, P2000) : object 'U3003' not found

Использование lapply

В этом случае я создал функцию:

groupCombDTC <- function(x) {
  OEM_final %>%
  group_by(coche_OEM, x) %>%
  filter(dia_hora_OEM == min(dia_hora_OEM))
}

И затем я запустил lapply():

lapply(colnames(OEM_final)[8:17], groupCombDTC)

Я получаю эту ошибку:

Error: Column `x` is unknown

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

1 Ответ

1 голос
/ 03 апреля 2020

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

Существует несколько решений. Это хорошо работает

groupCombDTC <- function(x) {
  OEM_final %>%
  group_by(coche_OEM, !!rlang::sym(x)) %>%
  filter(dia_hora_OEM == min(dia_hora_OEM))
}

Требуется использовать вместе !! и rlang::sym, чтобы заключить в кавычки и оценить имя вашей переменной.

Имена столбцов, поскольку аргументы легче обрабатывать с data.table. Если вы хотите больше элементов, касающихся SE / NSE в dplyr и data.table, вы можете взглянуть на сообщение в блоге Я написал несколько дней в go

...