Подмножество данных повторного измерения в R

#r #subset

#r #подмножество

Вопрос:

Для следующего набора данных

 ndat=data.frame(id=c(2,2,3,3,3,3,4,4,5,5,5,5,6,6,6),
                    vc=c("bl",'m0', "bl","m0","m1","m2","bl","m0","bl","m0","m1","m2","bl","m0","m1"),
                    yval=rnorm(15))
> ndat
   id vc        yval
1   2 bl  0.24033800
2   2 m0 -0.59292580
3   3 bl  1.13617080
4   3 m0  0.08219857
5   3 m1  1.37190692
6   3 m2 -1.24172726
7   4 bl -1.66812438
8   4 m0  1.66443525
9   5 bl -0.95858647
10  5 m0  0.93729295
11  5 m1  0.64848009
12  5 m2  0.57172027
13  6 bl -0.34740570
14  6 m0  0.15883881
15  6 m1  0.88409881
 

Я хочу создать подмножество на основе id и vc . Подмножество id , у которого vc есть bl , m0 и m1 (все три). Набор данных должен иметь id 3,5,6

Ответ №1:

Мы можем сгруппировать по ‘id’ и filter где all векторные элементы ‘bl’, ‘m0’ и ‘m1’ являются %in% столбцом ‘vc’

 library(dplyr)
ndat %>% 
    group_by(id) %>%
    filter(all(c('bl', 'm0', 'm1') %in% vc), vc %in% c('bl', 'm0', 'm1')) %>%
    ungroup
 

-вывод

 # A tibble: 9 x 3
#     id vc       yval
#  <dbl> <chr>   <dbl>
#1     3 bl     0.984 
#2     3 m0     0.275 
#3     3 m1     0.952 
#4     5 bl     0.242 
#5     5 m0    -1.10  
#6     5 m1     0.0883
#7     6 bl     0.448 
#8     6 m0     0.631 
#9     6 m1    -0.967 
 

Комментарии:

1. Что, если я не хочу ‘m2’, подмножество только для строк c (‘bl’, ‘m0’, ‘m1’)?

2. @Uddin обновил сообщение

Ответ №2:

Это также можно сделать следующим образом:

 library(dplyr)
#Code
new <- ndat %>% group_by(id) %>%
  filter(length(unique(vc) %in% c('bl', 'm0','m1'))>=3) %>%
  filter(vc %in% c('bl', 'm0','m1'))
 

Вывод:

 # A tibble: 9 x 3
# Groups:   id [3]
     id vc       yval
  <dbl> <chr>   <dbl>
1     3 bl    -1.67  
2     3 m0    -0.380 
3     3 m1     0.919 
4     5 bl    -0.0556
5     5 m0     0.519 
6     5 m1     0.301 
7     6 bl    -0.641 
8     6 m0    -0.850 
9     6 m1    -1.02  
 

Ответ №3:

Базовый параметр R, использующий subset ave

 subset(
  ndat,
  as.logical(ave(vc, id, FUN = function(x) all(c("bl", "m0", "m1") %in% x) amp; x %in% c("bl", "m0", "m1")))
)
 

предоставление

    id vc       yval
3   3 bl -1.2185123
4   3 m0 -1.2469732
5   3 m1 -1.5304222
9   5 bl -0.6663611
10  5 m0 -0.3416479
11  5 m1  1.6521134
13  6 bl  1.0613095
14  6 m0 -2.4401063
15  6 m1  1.5964508
 

Опция data.table

 dt <- as.data.table(ndat)
dt[dt[, Y := all(c("bl", "m0", "m1") %in% vc) amp; vc %in% c("bl", "m0", "m1"), id]$Y][, -c("Y")]
 

что дает

    id vc       yval
1:  3 bl  0.6630808
2:  3 m0  1.2458904
3:  3 m1  0.1636613
4:  5 bl -1.3373699
5:  5 m0  1.1810268
6:  5 m1  1.1541949
7:  6 bl  0.4885174
8:  6 m0  1.0508925
9:  6 m1  0.6994416