在R中两个因素的group_by()中使用lapply

时间:2020-04-03 15:02:40

标签: r for-loop dplyr tidyverse lapply

我有这个数据框(命名为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)
  • ...

我尝试了不同的方法来实现这一目标:

使用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 个答案:

答案 0 :(得分:1)

这是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更容易处理。如果您想在dplyrdata.table中找到更多关于SE / NSE的元素,可以看看我几天前写的blog post

相关问题