使用R

时间:2018-09-23 13:17:23

标签: r

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

每个人都有几条记录。 一个人的 Number 只有1条记录,其余为2条。 变量 Var 对于同一个人具有不同的值。

Number 等于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 :(得分:0)

您可以使用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])

答案 1 :(得分:0)

这是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

答案 2 :(得分:0)

一个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

数据

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")