подмножество фрейма данных, используя dplyr в R - PullRequest
0 голосов
/ 01 мая 2019

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

Вот кадр данных:

Groups_name  col1   col2
group1       3       4
group1       1       1
group1       1       1
group2       1       1
group3       3       7
group3       1       1
group4       3       3
group4       1       1

и по группам я хочу сохранить только группы, которые содержат хотя бы одну строку, где col1 > 1 и где col1 == col2 или col1 == col2+-2

Здесь я должен получить:

Groups_name  col1   col2
group1       3      4
group1       1      1
group1       1      1
group4       3      3
group4       1      1

как видите, я сохранил group1, потому что в первом ряду col1 >1 и col1 (3) = col2 +1 (4) Я также держу group 3, потому что col1 >1 и col1 (3) == col2 (3)

но group 1 был удален, потому что col1 что not > 1

И я также удалил group 3, потому что даже если col1 (3) > 1, col1 (3) не равен 7 + или - 2 (поэтому не равен 5,6,7,8 или 9)

С этого момента я попытался:

tab %>%
  group_by(Groups_name) %>%
  filter(all(col1 == col2,col2-2,col2+2))  %>%
  filter(any(col1 > 1))

Спасибо за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 01 мая 2019

Мы могли бы использовать any и all следующим образом

library(dplyr)
df %>%
  group_by(Groups_name) %>%
  filter(any(col1 > 1) & all(abs(col1 - col2) %in% 0:2))

#  Groups_name  col1  col2
#  <fct>       <int> <int>
#1 group1          3     4
#2 group1          1     1
#3 group1          1     1
#4 group4          3     3
#5 group4          1     1

Выбирает группы, в которых хотя бы одно значение в col1 больше 1, а абсолютная разница между col1 и col2 всегда между 0 и 2.

1 голос
/ 01 мая 2019

Мы можем сделать это за data.table

library(data.table)
setDT(df)[, .SD[any(col1 >1) & all(abs(col1 - col2) %in% 0:2)], .(Groups_name)]
#   Groups_name col1 col2
#1:      group1    3    4
#2:      group1    1    1
#3:      group1    1    1
#4:      group4    3    3
#5:      group4    1    1

данные

df <- structure(list(Groups_name = c("group1", "group1", "group1", 
"group2", "group3", "group3", "group4", "group4"), col1 = c(3L, 
1L, 1L, 1L, 3L, 1L, 3L, 1L), col2 = c(4L, 1L, 1L, 1L, 7L, 1L, 
3L, 1L)), class = "data.frame", row.names = c(NA, -8L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...