我正在编写一个函数,该函数接受 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"
我不确定我是否完全理解你希望你的函数做什么。从您的示例来看,您似乎只是想检查所有四列是否匹配,在这种情况下,类似这样的操作应该有效:
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)
}
如果这不是您的意思,请告诉我。