使用dplyr

时间:2018-03-13 18:53:30

标签: r dplyr

我有一个包含DX1到DX10列的数据集,其中字符变量用iCD9codes编码 我想用代码4289,4281,4282过滤我的数据集,该代码位于DX1到DX10的任何地方

使用dplyr更简单的方法吗?

enter image description here

3 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

x <- Y %>%
    gather(key = "DX", value = "code", starts_with("DX")) %>%
    filter(DX %in% c("4289", "4281", "4282"))

正如弗兰克在评论中指出的那样,dplyr在数据整洁时效果最好,这意味着变量在列中,观察在行中。使用tidyr::gather将数据合并为两列,一个名为key的{​​{1}}列告诉您该值来自哪个列,以及DX列,此处称为{{ 1}},即单元格中的数字。 然后很容易使用value,因为您只需要一列,即新的code列。

有关详细信息,请参阅本章tidy data

答案 2 :(得分:0)

z&lt; -Y%&gt;%过滤器(DX1%in%c(&#34; 4289&#34;,&#34; 4281&#34;,&#34; 4282&#34;)| DX2%in %c(&#34; 4289&#34;,&#34; 4281&#34;,&#34; 4283&#34;)|%c中的DX3%(&#34; 4289&#34;,&#34; 4281&#34;,&#34; 4283&#34;)|%c中的DX4%(&#34; 4289&#34;,&#34; 4281&#34;,&#34; 4283&#34;)| DX5 %c%(&#34; 4289&#34;,&#34; 4281&#34;,&#34; 4283&#34;)|%c中的DX6%(&#34; 4289&#34;,&# 34; 4281&#34;,&#34; 4283&#34;)|%c中的DX7%(&#34; 4289&#34;,&#34; 4281&#34;,&#34; 4283&#34;) |%c中的DX8%(&#34; 4289&#34;,&#34; 4281&#34;,&#34; 4283&#34;)|%c中的DX9%(&#34; 4289&#34;, &#34; 4281&#34;,&#34; 4283&#34;)|%c中的DX10%(&#34; 4289&#34;,&#34; 4281&#34;,&#34; 4283&#34 ;))