Фильтрация в группе dplyr только при выполнении условия, иначе не будет - PullRequest
0 голосов
/ 14 октября 2019

У меня есть таблица right_join, где у меня есть значения NA для некоторых столбцов, в зависимости от того, из какой таблицы произошла запись. У каждого «попадания» в таблице есть «индекс», который начинается с 0.

Я хочу group_by(hit, indx) и выполнить некоторую условную фильтрацию. Я хочу использовать dplyr предпочтительно.

Вот данные:

test <- tibble(hit = c(rep("101mA", 4), rep("1914A", 5)), 
               indx = c(0, 0, 0, 1, 0, 0, 0, 0, 1),
               hit_start = c(7, 63, 105, 131, 4, 7, 56, 64, 147), 
               hit_end = c(112, 82, 126, 152, 82, 34, 83, 81, 166), 
               stamp_score = c(NA, 9.32, 9.30, 9.49, NA, NA, NA, 8.16, 9.15), 
               bit_score = c(76.2, NA, NA, NA, 84.7, 8.3, 0.3, NA, NA) 
              )

Вот таблица:

# A tibble: 9 x 6
  hit    indx hit_start hit_end stamp_score bit_score
  <chr> <dbl>     <dbl>   <dbl>       <dbl>     <dbl>
1 101mA     0         7     112       NA         76.2
2 101mA     0        63      82        9.32      NA  
3 101mA     0       105     126        9.30      NA  
4 101mA     1       131     152        9.49      NA  
5 1914A     0         4      82       NA         84.7
6 1914A     0         7      34       NA          8.3
7 1914A     0        56      83       NA          0.3
8 1914A     0        64      81        8.16      NA  
9 1914A     1       147     166        9.15      NA 

В каждом group_by(hit, indx), если естьэто даже один NA в столбце "stamp_score", я хочу сохранить строки с записями NA. Однако я хочу сохранить все строки, если в столбце «stamp_score» для группы нет NA.

Вот что я ожидаю в конце:

# A tibble: 6 x 6
  hit    indx hit_start hit_end stamp_score bit_score
  <chr> <dbl>     <dbl>   <dbl>       <dbl>     <dbl>
1 101mA     0         7     112       NA         76.2
4 101mA     1       131     152        9.49      NA  
5 1914A     0         4      82       NA         84.7
6 1914A     0         7      34       NA          8.3
7 1914A     0        56      83       NA          0.3
9 1914A     1       147     166        9.15      NA

Пожалуйстаобратите внимание, что я намерен в конечном итоге использовать код для таблицы с> 10000 обращений, каждое со своим собственным "indx".

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

На самом деле, я нашел ответ в другом связанном вопросе .

При этом используется data.table один вкладыш, который в моем случае был:

library(data.table)

test <- setDT(test)[, if(any(is.na(stamp_score))) .SD[is.na(stamp_score)] else .SD, .(hit, indx)]

По существуэтот код подразделяет группу только в том случае, если в столбце «stamp_score» есть NA, в противном случае его нет.

Спасибо всем, кто пытался помочь, а также помог мне улучшить мой вопрос с течением времени.

0 голосов
/ 14 октября 2019

Я не уверен, хотите ли вы сохранить значения с NA в stamp_score или отбросить их. но я думаю, что это должно сделать работу:

library(dplyr)

# create the df where you only have group with non missing obs
noNAind <- test %>% group_by(indx) %>% filter(!any(is.na(stamp_score))) %>% ungroup()
noNAhit <- test %>% group_by(hit) %>% filter(!any(is.na(stamp_score))) %>% ungroup()

# create the df with all the missing obs 
missind<- test %>% group_by(indx) %>% filter(is.na(stamp_score)) %>% ungroup()
misshit<- test %>% group_by(hit) %>% filter(is.na(stamp_score)) %>% ungroup()

# merge the data
test<- full_join(noNAind,noNAhit) %>% distinct()
test<- full_join(test,missind) %>% distinct()
test<- full_join(test,misshit) %>% distinct()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...