首页 > 解决方案 > 如何过滤多个可能的值?

问题描述

我有一个看起来像这样的表:

ID   Var1P     Var1C     Var2P    Var2C   Var3P   Var3P   NoDxP NoDxC
101  1         3         3        1        1      1       1      1
102  1         1         1        2        1      1       1      1
103  2         1         1        3        1      1       1      1
104  1         0         2        0        1      1       1      1

我一直在尝试做的是仅过滤所有值为 0、1 或 2 的观察值。基本上摆脱任何得分为 3 或更高的值。我正在尝试使用此过滤器方法 - 应注意此数据框属于类字符:

namesnovalue <- dataframe[c(2:7)]
namesnovalue <- names(namesnovalue)
filternovalue <- function(x) {
  filter(dataframe, x == '1' | x == '0' | x == '2')
}

novalue <- sapply(dataframe[namesnovalue], FUN=filternovalue, simplify=TRUE, USE.NAMES=TRUE)
novalue <- as.data.frame(novalue)

我认为该功能试图做我为它做的事情。但是,在我将 novalue 作为数据框之前,我得到了数据的矩阵。当我把它变成一个数据框时,我得到一个由矩阵组成的数据框(或者它看起来)。我不确定我在哪里写错了论点。

作为参考,我试图得到的数据输出是这样的:

ID   Var1P     Var1C    Var2P    Var2C    Var3P    Var3C  NoDxP   NoDxC
102  1         1        1        2        1        1      1       1
104  1         0        2        0        1        1      1       1

感谢大家的帮助和时间!

标签: r

解决方案


根据更新的问题进行编辑。

使用dplyr

library(dplyr)
df1 %>% 
  filter(across(-starts_with("ID"), ~ . < 3))

结果:

   ID Var1P Var1C Var2P Var2C Var3P Var3C
1 102     1     1     1     2     1     1
2 104     1     0     2     0     1     1

数据在哪里df1

df1 <- structure(list(ID = 101:104, Var1P = c(1L, 1L, 2L, 1L), 
                      Var1C = c(3L, 1L, 1L, 0L), Var2P = c(3L, 1L, 1L, 2L), 
                      Var2C = c(1L, 2L, 3L, 0L), Var3P = c(1L, 1L, 1L, 1L), 
                      Var3C = c(1L, 1L, 1L, 1L)), 
                      class = "data.frame", 
                      row.names = c(NA, -4L))

推荐阅读