извлечение строк в зависимости от значения нескольких столбцов - PullRequest
0 голосов
/ 15 ноября 2018

У меня большой массив данных, который упрощен ниже.Учитывая следующую структуру фрейма данных, мне нужно свернуть, чтобы вернуть две отдельные строки, в которых col3 имеет разные значения, а col1 и col2 имеют уникальные значения.

dat <- data.frame("col1" = c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1), 
       "col2" = c( "A","A", "A", "A", "A", "A", "A", "A", "A", "A"," A", "A", "A", "A", "A"),
       "col3" = c( "Z", "Z", "Z", "Z", "Z", "Z", "Z", "Z", "Z", "Y", "Y", "Y", "Y", "Y", "Y"))

   col1 col2 col3
1     1    A    Z
2     1    A    Z
3     1    A    Z
4     1    A    Z
5     1    A    Z
6     1    A    Z
7     1    A    Z
8     1    A    Z
9     1    A    Z
10    1    A    Y
11    1    A    Y
12    1    A    Y
13    1    A    Y
14    1    A    Y
15    1    A    Y

Так что в этом случае мне нужно было бы вернуть только следующее:

   col1 col2 col3
      1    A    Z
      1    A    Y

Если бы, однако, col3 был только z, я бы не возвратил никаких строк.Я могу получить количество этих данных с помощью табличной функции, но мне нужно увидеть фактические строки.Есть идеи?

Спасибо

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Попробуйте это с:

library(dplyr)
dat %>%
  group_by(col1, col2) %>%
  filter(length(unique(col3)) > 1) %>%
  distinct()

Если dat выглядит следующим образом:

dat <- structure(list(col1 = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1), col2 = c("A", "A", "A", "A", "A", "A", "A", "A", "A", 
"A", "A", "A", "A", "A", "A"), col3 = c("Z", "Z", "Z", "Z", "Z", 
"Z", "Z", "Z", "Z", "Z", "Z", "Z", "Z", "Z", "Z")), class = "data.frame", row.names = c(NA, 
-15L))

Вы не получаете строк следующим образом:

# A tibble: 0 x 3
# Groups:   col1, col2 [0]
# ... with 3 variables: col1 <dbl>, col2 <chr>, col3 <chr>

Если dat соответствует исходному сообщению, вы получите результат, который вам нужен:

# A tibble: 2 x 3
# Groups:   col1, col2 [1]
   col1 col2  col3 
  <dbl> <chr> <chr>
1     1 A     Z    
2     1 A     Y    

Обратите внимание, что я использую length(unique()) в фильтре вместо n_distinct, потому что есть ошибка dplyr, из-за которой n_distinct в фильтре сгруппированного фрейма данных работает очень медленно.

0 голосов
/ 15 ноября 2018

Nice easy dplyr решение:

dat <- structure(list(col1 = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1), col2 = c("A", "A", "A", "A", "A", "A", "A", "A", "A", 
"A", "A", "A", "A", "A", "A"), col3 = c("Z", "Z", "Z", "Z", "Z", 
"Z", "Z", "Z", "Z", "Y", "Y", "Y", "Y", "Y", "Y")), class = "data.frame", row.names = c(NA, 
-15L))

library(dplyr)

dat %>% group_by(col1,col2) %>% distinct()

# A tibble: 2 x 3
# Groups:   col1, col2 [1]
   col1 col2  col3 
  <dbl> <chr> <chr>
1     1 A     Z    
2     1 A     Y

В вашей версии dat у вас есть пробел в одном из ваших значений col2, если это не опечатка, вам нужносначала исправьте это так, чтобы distinct() агрегировал правильно:

dat %>% mutate(col2 = trimws(col2)) %>% group_by(col1,col2) %>% distinct()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...