使用 case_when 和 dplyr::filter() 来压缩几个嵌套的 ifelse 语句

问题描述 投票:0回答:1

我正在编写一个函数,该函数接受 4 个输入,并使用 dplyr 根据输入值格式化数据帧。请注意,每个输入可以有 2 个值:“None”或“X”。我想编写一个函数,该函数将仅过滤具有值“X”的字段,并在对具有值“X”的字段进行过滤和分组后计算汇总统计数据。我编写了一个非常繁琐的版本,其中涉及大量嵌套的 if else 循环,以便过滤 4 个输入变量的 16 种可能的值组合中的每一种。我希望能够压缩这段代码,并且我相信我应该能够在 dplyr 中使用 case_when、filter 和 group_by 来做到这一点,但我很难理解如何做到这一点。

x1 <- c(rep(0:1, each = 8))
x2 <- c(rep(0:1, 8))
x3 <- c(rep(0:1, each = 4, times = 2))
x4 <- c(rep(0:1, each = 2, times = 4))
y <- c(seq(1:16))

df <- data.frame(x1,x2,x3,x4,y)

所以我的 df 是:

   x1 x2 x3 x4  y
1   0  0  0  0  1
2   0  1  0  0  2
3   0  0  0  1  3
4   0  1  0  1  4
5   0  0  1  0  5
6   0  1  1  0  6
7   0  0  1  1  7
8   0  1  1  1  8
9   1  0  0  0  9
10  1  1  0  0 10
11  1  0  0  1 11
12  1  1  0  1 12
13  1  0  1  0 13
14  1  1  1  0 14
15  1  0  1  1 15
16  1  1  1  1 16

我的职能是:

    exampleFX <- function(z1, z2, z3, z4) {
      df <- dplyr::filter(dplyr::case_when(
                      z1 != 0 ~ x1 == z1,
                      z2 != 0 ~ x2 == z2,
                      z3 != 0 ~ x3 == z3,
                      z4 != 0 ~ x4 == z4
      ))
      return(df$y)
    }

当我测试它时,

exampleFX(0,1,0,1)

,我期望得到 df$y = 4。但是,我收到以下错误:

 Error in UseMethod("filter") : 
  no applicable method for 'filter' applied to an object of class "logical"
r dplyr logic
1个回答
0
投票

我不确定我是否完全理解你希望你的函数做什么。从您的示例来看,您似乎只是想检查所有四列是否匹配,在这种情况下,类似这样的操作应该有效:

exampleFX <- function(x1, x2, x3, x4) {
  match_row <- df[df$x1 == x1 & df$x2 == x2 & df$x3 == x3 & df$x4 == x4, ]
  return(match_row$y)
}

如果这不是您的意思,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.