Условно удалить строки из базы данных, используя R - PullRequest
0 голосов
/ 23 сентября 2018
ID       Number      Var
1        2           6
1        2           7
1        1           8
1        2           9
1        2           10
2        2           3
2        2           4
2        1           5
2        2           6

У каждого человека есть несколько записей.Существует только одна запись о человеке, у которого Число равно 1, остальные - 2. Переменная Var имеет разные значения для одного и того же человека.

Когда Число равно 1, соответствующий Var (мы называем это P) различен для разных людей.

Теперь я хочу удалить строки, у которых Var > P для каждого человека.

В конце я хочу это

    ID       Number      Var
    1        2           6
    1        2           7
    1        1           8
    2        2           3
    2        2           4
    2        1           5

Ответы [ 3 ]

0 голосов
/ 23 сентября 2018

Вот решение с data.table:

library(data.table)
dt <- fread(
"ID       Number      Var
1        2           6
1        2           7
1        1           8
1        2           9
1        2           10
2        2           3
2        2           4
2        1           5
2        2           6")

dt[, .SD[Var <= Var[Number==1]], ID]
#    ID Number Var
# 1:  1      2   6
# 2:  1      2   7
# 3:  1      1   8
# 4:  2      2   3
# 5:  2      2   4
# 6:  2      1   5
0 голосов
/ 23 сентября 2018

A base R опция будет

df1[with(df1, Var <= ave(Var * (Number == 1), ID, FUN = function(x) x[x!=0])),]
#  ID Number Var
#1  1      2   6
#2  1      2   7
#3  1      1   8
#6  2      2   3
#7  2      2   4
#8  2      1   5

data

df1 <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), Number = c(2L, 
 2L, 1L, 2L, 2L, 2L, 2L, 1L, 2L), Var = c(6L, 7L, 8L, 9L, 10L, 
3L, 4L, 5L, 6L)), row.names = c(NA, -9L), class = "data.frame")
0 голосов
/ 23 сентября 2018

Вы можете использовать dplyr::first, где Num==1, чтобы получить первое Var значение

library(dplyr)
df %>% group_by(ID) %>% mutate(Flag=first(Var[Number==1])) %>% 
       filter(Var <= Flag) %>% select(-Flag)

#short version and you sure there is a one Num==1
df %>% group_by(ID) %>% filter(Var <= Var[Number==1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...