【问题标题】:subsetting data with multiple conditions using dplyr使用 dplyr 对具有多个条件的数据进行子集化
【发布时间】:2021-05-04 22:39:49
【问题描述】:

我有一个包含 DX1 到 DX10 列的数据集,其中字符变量用 iCD9codes 编码,例如 我想使用代码 4289、4281、4282 过滤我的数据集,这些代码位于 DX1 到 DX10 的任何位置

使用 dplyr 有更简单的方法吗?

enter image description here

【问题讨论】:

  • 用真实数据(不是图片)更新您的问题。还有,什么容易?对于某些用户来说,base R 比 dplyr 更容易
  • 寻求帮助时,您应该包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出。数据图片并不是特别有用。
  • 你是说你想要所有出现这三个数字中至少一个的行吗?
  • @p0bs 问题很不清楚(也许他想要行,也许列,也许全部,也许一个值)
  • @PoGibas - 同意 - 只是想在步骤中引出更多细节

标签: r dplyr


【解决方案1】:

假设您想保留原始数据集中的所有列,有两种方法可以解决这个问题:

1. 使用filter_all 过滤所有列。这是假设您的数据集仅包含来自 DX1 - DX10

输入:

set.seed(10)
df <- tibble(DX1 = sample(4280:4380, 10),
             DX2 = c(4281, sample(4200:4500, 9)),
             DX3 = sample(4270:4310, 10),
             DX4 = sample(4280:4295, 10))

df
# A tibble: 10 x 4
     DX1   DX2   DX3   DX4
   <int> <dbl> <int> <int>
 1  4331 4281.  4304  4285
 2  4310 4396.  4310  4288
 3  4322 4370.  4293  4281
 4  4347 4233.  4299  4282
 5  4288 4377.  4283  4290
 6  4301 4306.  4284  4284
 7  4306 4326.  4294  4287
 8  4305 4215.  4298  4289
 9  4337 4277.  4277  4294
10  4319 4316.  4309  4291

方法:

df %>% filter_all(any_vars(. == 4282 | . == 4281 | . == 4289))

输出:

# A tibble: 4 x 4
    DX1   DX2   DX3   DX4
  <int> <dbl> <int> <int>
1  4331 4281.  4304  4285
2  4322 4370.  4293  4281
3  4347 4233.  4299  4282
4  4305 4215.  4298  4289


2. 使用filter_at 过滤某些列。这是假设您的数据集还包含除 DX1 - DX10 之外的其他列。

输入:

set.seed(124)
df2 <- tibble(DX1 = sample(4280:4380, 10),
              DX2 = c(4281, sample(4200:4500, 9)),
              DX3 = sample(4250:4350, 10),
              DX4 = sample(4280:4300, 10),
              AA1 = sample(4280:4295, 10),
              AA2 = c(sample(4500:5500, 9), 4289))

df2
# A tibble: 10 x 6
     DX1   DX2   DX3   DX4   AA1   AA2
   <int> <dbl> <int> <int> <int> <dbl>
 1  4288 4281.  4253  4288  4285 4649.
 2  4320 4432.  4312  4296  4282 4920.
 3  4331 4457.  4309  4285  4291 5335.
 4  4318 4426.  4257  4287  4288 5020.
 5  4301 4453.  4290  4294  4294 4717.
 6  4308 4321.  4282  4281  4284 4746.
 7  4335 4216.  4269  4299  4283 4864.
 8  4326 4370.  4328  4282  4292 4731.
 9  4365 4419.  4274  4292  4281 5239.
10  4305 4459.  4326  4295  4289 4289.

方法:

df2 %>% filter_at(vars(starts_with("DX")), any_vars(. == 4282 | . == 4281 | . == 4289))

输出:

# A tibble: 3 x 6
     DX1   DX2   DX3   DX4   AA1   AA2
   <int> <dbl> <int> <int> <int> <dbl>
 1  4288 4281.  4253  4288  4285 4649.
 2  4308 4321.  4282  4281  4284 4746.
 3  4326 4370.  4328  4282  4292 4731.

【讨论】:

    【解决方案2】:
    x <- Y %>%
        gather(key = "DX", value = "code", starts_with("DX")) %>%
        filter(DX %in% c("4289", "4281", "4282"))
    

    正如 Frank 在 cmets 中指出的那样,dplyr 在数据整齐时效果最佳,这意味着变量在列中,而观察值在行中。使用tidyr::gather 将数据组合成两列,一列名为DXkey 列告诉您该值来自哪个列,另一列value 此处称为code,即细胞。 然后很容易使用filter,因为您只需要一列,即新的DX 列。

    有关更多信息,请参阅tidy data 上的本章。

    【讨论】:

      【解决方案3】:
      z<-Y %>% 
      filter(DX1%in% c("4289", "4281","4282") | DX2%in% c("4289", "4281", "4283") | DX3 %in% c("4289", "4281", "4283") | DX4 %in% c("4289", "4281", "4283")| DX5%in% c("4289", "4281", "4283")| DX6 %in% c("4289", "4281", "4283") | DX7%in% c("4289", "4281", "4283") | DX8%in% c("4289", "4281", "4283")| DX9%in% c("4289", "4281", "4283")| DX10%in% c("4289", "4281", "4283"))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-04
        • 1970-01-01
        • 1970-01-01
        • 2022-06-18
        • 2018-05-08
        • 2021-05-29
        • 1970-01-01
        • 2016-04-23
        相关资源
        最近更新 更多