Поднабор данных, основанный на уровнях - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть следующий фрейм данных в R. Я хочу разместить его на основе трех критериев: для каждого уникального значения x в пределах каждого уровня идентификатора

  1. Если есть только 1 значение x, оставьте эту строку
  2. Если x имеет одинаковое значение z с двумя разными значениями y, сохраните строку, где y не = 1,3
  3. Если x имеет три значения z, оставьте две строки там, где y не = 1,3

id	x	y	z
a	1	0.2	100
a	2	1	200
a	2	1.3	200
b	1	0.5	400
b	1	1	500
b	1	1.3	600

решение будет выглядеть так:

id	x	y	z
a	1	0.2	100
a	2	1	200
b	1	0.5	400
b	1	1	500

Буду признателен за любую помощь

1 Ответ

2 голосов
/ 02 апреля 2020

Мы можем группировать по 'id', 'x' и filter в зависимости от условий

library(dplyr)
df1 %>% 
   group_by(id, x) %>% 
   filter(n() == 1|(n() > 1 & y != 1.3))

data

df1 <- structure(list(id = c("a", "a", "a", "b", "b", "b"), x = c(1L, 
2L, 2L, 1L, 1L, 1L), y = c(0.2, 1, 1.3, 0.5, 1, 1.3), z = c(100L, 
200L, 200L, 400L, 500L, 600L)), class = "data.frame", row.names = c(NA, 
-6L))
...