выбрать только строки с одинаковым идентификатором и конкретным значением из другого столбца в R - PullRequest
0 голосов
/ 02 июля 2018

У меня есть следующие данные с идентификатором и значением:

id <- c("1103-5","1103-5","1104-2","1104-2","1104-4","1104-4","1106-2","1106-2","1106-3","1106-3","2294-1","2294-1","2294-2","2294-2","2294-2","2294-3","2294-3","2294-3","2294-4","2294-4","2294-5","2294-5","2294-5","2300-1","2300-1","2300-2","2300-2","2300-4","2300-4","2321-1","2321-1","2321-2","2321-2","2321-3","2321-3","2321-4","2321-4","2347-1","2347-1","2347-2","2347-2")

value <- c(6,3,6,3,6,3,6,3,6,3,3,6,9,3,6,9,3,6,3,6,9,3,6,9,6,9,6,9,6,9,3,9,3,9,3,9,3,9,6,9,6)

Если вы заметили, есть несколько значений для одного и того же идентификатора. То, что я хотел бы сделать, это получить значения, которые только 3 и 6, только если идентификаторы одинаковы. например Идентификатор «1103-5» имеет 3 и 6, поэтому он должен быть в списке, но не «2347-2»

Я использую R

Один метод, который я попробовал, заключается в следующем, но он дает мне все со значениями 3 и 6.

d <- data.frame(id, value)
group36 <- d[d$value == 3 | d$value == 6,]

и

d %>% group_by(id) %>% filter(3 == value | 6 == value)

Вывод должен быть таким:

id  value
1103-5  6
1103-5  3
1104-2  6
1104-2  3
1104-4  6
1104-4  3
1106-2  6
1106-2  3
1106-3  6
1106-3  3
2294-1  3
2294-1  6
2294-2  3
2294-2  6
2294-3  3
2294-3  6
2294-4  3
2294-4  6
2294-5  3
2294-5  6

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Не уверен, что это то, что вы хотите. Мы можем отфильтровать строки, равные 3 или 6, затем преобразовать из длинного в широкоформатный формат и сохранить только столбцы, которые имеют значения 3 и 6. После этого конвертируйте обратно в длинный формат.

library(dplyr)
library(tidyr)

id <- c("1103-5","1103-5","1104-2","1104-2","1104-4","1104-4","1106-2","1106-2",
        "1106-3","1106-3","2294-1","2294-1","2294-2","2294-2","2294-2",
        "2294-3","2294-3","2294-3","2294-4","2294-4","2294-5","2294-5","2294-5",
        "2300-1","2300-1","2300-2","2300-2","2300-4","2300-4","2321-1","2321-1",
        "2321-2","2321-2","2321-3","2321-3","2321-4","2321-4","2347-1","2347-1","2347-2","2347-2")

value <- c(6,3,6,3,6,3,6,3,6,3,3,6,9,3,6,9,3,6,3,6,9,3,6,9,6,9,6,9,6,9,3,9,3,9,3,9,3,9,6,9,6)

d <- data.frame(id, value)

d %>% 
  group_by(id) %>% 
  filter(value %in% c(3, 6)) %>% 
  mutate(rows = 1:n()) %>%
  spread(key = id, value) %>% 
  select_if(~ all(!is.na(.)))

#> # A tibble: 2 x 11
#>    rows `1103-5` `1104-2` `1104-4` `1106-2` `1106-3` `2294-1` `2294-2`
#>   <int>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
#> 1     1        6        6        6        6        6        3        3
#> 2     2        3        3        3        3        3        6        6
#> # ... with 3 more variables: `2294-3` <dbl>, `2294-4` <dbl>,
#> #   `2294-5` <dbl>

d %>% 
  group_by(id) %>% 
  filter(value %in% c(3, 6)) %>% 
  mutate(rows = 1:n()) %>%
  spread(key = id, value) %>% 
  select_if(~ all(!is.na(.))) %>% 
  select(-rows) %>% 
  gather(id, value)

#> # A tibble: 20 x 2
#>    id     value
#>    <chr>  <dbl>
#>  1 1103-5     6
#>  2 1103-5     3
#>  3 1104-2     6
#>  4 1104-2     3
#>  5 1104-4     6
#>  6 1104-4     3
#>  7 1106-2     6
#>  8 1106-2     3
#>  9 1106-3     6
#> 10 1106-3     3
#> 11 2294-1     3
#> 12 2294-1     6
#> 13 2294-2     3
#> 14 2294-2     6
#> 15 2294-3     3
#> 16 2294-3     6
#> 17 2294-4     3
#> 18 2294-4     6
#> 19 2294-5     3
#> 20 2294-5     6

Создано в 2018-07-01 пакетом Представить (v0.2.0.9000).

0 голосов
/ 02 июля 2018
d<-group_by(d,id)
filter(d,any(value==3),any(value==6))

Это дает вам все идентификаторы, где есть значение 3 (где-то) И значение 6 (где-то). Напоминаем, что ваши данные содержат несколько идентификаторов с ТРИ значения. В этих случаях, если присутствуют как 3, так и 6, он будет включен в результат.

Если вы хотите исключить те строки, которые остались равными 3 или 6, добавьте:

filter(d,value==3 | value==6)

Если вы хотите исключить идентификаторы, которые также имеют 3 и 6 в качестве значений, но также имеют ДРУГИЕ значения, используйте это:

filter(d,any(value==3),any(value==6),value==3 | value==6)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...