#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