Удалить группу на основе подсчета другого столбца (R) - PullRequest
1 голос
/ 29 марта 2019

У меня есть датафрейм, и я хочу сохранить только те группы, в которых есть как минимум 2 случая с автомобилями И еще один вывод для хранения групп будет как минимум в 2 случаях без автомобилей:

Group = c('a','a','a','b','b','b','c','c','c','c')
Car = c(1,1,0,0,0,0,1,0,0,0) # 1 = Have car, 0 = No car
df = data.frame(Group,Car)
df$Group = factor(df$Group)
df$Car = factor(df$Car)

   Group Car
1      a   1
2      a   1
3      a   0
4      b   0
5      b   0
6      b   0
7      c   1
8      c   0
9      c   0
10     c   0

Вывод должен быть:

Group Car
a      1
a      1
a      0

2-й выход:

Group Car
b      0
b      0
b      0
c      1
c      0
c      0
c      0

У меня очень большой набор данных. Пожалуйста помоги. Спасибо!

Ответы [ 2 ]

2 голосов
/ 29 марта 2019

Для 1-го случая: группы, у которых есть как минимум 2 случая с автомобилями

library(dplyr)

df %>%
  group_by(Group) %>%
  filter(sum(Car) > 1)

#   Group   Car
#   <fct> <dbl>
#1  a         1
#2  a         1
#3  a         0

или база R ave

subset(df, ave(Car, Group, FUN = sum) > 1)

и с data.table

library(data.table)
setDT(df)[, if (sum(.SD) > 1) .SD, by = Group]

Для 2-го случая: группы по крайней мере с 2 случаями Без машины

df %>%
  group_by(Group) %>%
  filter(sum(Car == 0) > 1)


#  Group   Car
#  <fct>  <dbl>
#1  b       0
#2  b       0
#3  b       0
#4  c       1
#5  c       0
#6  c       0
#7  c       0

и с основанием R ave

subset(df, ave(Car == 0, Group, FUN = sum) > 1)

с data.table

setDT(df)[, if (sum(.SD == 0) > 1) .SD, by = Group]

data

Group = c('a','a','a','b','b','b','c','c','c','c')
Car = c(1,1,0,0,0,0,1,0,0,0) 
df = data.frame(Group,Car)
0 голосов
/ 29 марта 2019

Мы можем получить оба набора данных в list за один шаг, используя split

lst1 <- split(df, df$Group %in% names(which(rowsum(df$Car, df$Group)[,1] >= 2)))
lst1
#$`FALSE`
#   Group Car
#4      b   0
#5      b   0
#6      b   0
#7      c   1
#8      c   0
#9      c   0
#10     c   0

#$`TRUE`
#  Group Car
#1     a   1
#2     a   1
#3     a   0

Если нам нужно извлечь элементы list, используйте [[

lst1[[1]]
lst1[[2]]

Данные

Group <- c('a','a','a','b','b','b','c','c','c','c')
Car <- c(1,1,0,0,0,0,1,0,0,0) 
df <- data.frame(Group,Car)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...