首页 > 解决方案 > 基于“否定”的数据帧子集

问题描述

我要做的基本上是创建没有特定诊断代码的患者数据框的子集。

例如,假设我不想要诊断 NIS 代码中的代码 1111、1112 和 1113(所有患者,但具有此代码的患者)

我在想我会做这样的事情,但它对我不起作用:(

假设 NIS 文件中只有 10 个诊断代码(尽管通常最多 30 个)

dataframe1<- subset(dataframe1, grepl(!1111,DX1) | grepl(!1111, DX2) | grepl(!1111, DX3) | grepl(!1111, DX4) | grepl(!1111, DX5) | grepl(!1111, DX6) | grepl(!1111, DX7) | grepl(!1111, DX8) | grepl(!1111, DX9) | grepl(!1111, DX10) | grepl(!1112,DX1) | grepl(!1112, DX2) | grepl(!1112, DX3) | grepl(!1112, DX4) | grepl(!1112, DX5) | grepl(!1112, DX6) | grepl(!1112, DX7) | grepl(!1112, DX8) | grepl(!1112, DX9) | grepl(!1112, DX10) | | grepl(!1113,DX1) | grepl(!1113, DX2) | grepl(!1113, DX3) | grepl(!1113, DX4) | grepl(!1113, DX5) | grepl(!1113, DX6) | grepl(!1113, DX7) | grepl(!1113, DX8) | grepl(!1113, DX9) | grepl(!1113, DX10))

我用了“!” 因为我认为这意味着“否定”或选择那些没有此 ID 的人。

当我运行它时,它给了我 0 个观察结果——有人可以帮忙吗?

我也尝试过这样做dataframe1<- filter(dataframe1, !(DX1:DX30 %in% 1111:1113)),这给了我这个信息:

“错误:向量内存耗尽(达到限制?)”

标签: r

解决方案


这是一个基本的 R 方式。

not_wanted <- 1111:1113
inx <- apply(dataframe1, 1, function(x) all(!x %in% not_wanted))
dataframe1[inx, ]
#   DX1  DX2  DX3  DX4
#9 1116 1115 1115 1116

注意:如果性能很重要,R 矩阵访问比 data.frame 访问更快。
先强制

mat1 <- dataframe1

将使这段代码的速度加倍。


测试数据

set.seed(2021)
dataframe1 <- replicate(4, sample(1111:1116, 20, TRUE))
dataframe1 <- as.data.frame(dataframe1)
names(dataframe1) <- paste0("DX", 1:4)

推荐阅读