根据他们的价值范围移除个人

时间:2014-07-09 15:20:32

标签: r rows

我有一个带有两个变量的df,一个带有ID,另一个带有一个名为numbers的变量。我想帮助那些没有用数字1开始他们的数字序列的人。

我设法通过创建二进制指标并排除此人是否有此指标来实现此目的。但是,必须有一个更简单,更优雅的方式来做到这一点?

示例数据和用于实现期望结果的代码如下。

谢谢。

示例df:

zz<-"    names numbers
1   john       1
2   john       2
3   john       3
4   john       4
5   john       5
6   john       6
7   john       7
8   john       8
9   mary       4
10  mary       5
11  mary       6
12  mary       7
13  mary       8
14  mary       9
15  mary      10
16  mary      11
17  mary      12
18   pat       1
19   pat       2
20   pat       3
21   pat       4
22   pat       5
23   pat       6
24   pat       7
25   pat       8
26   pat       9
27   pat      10
28   sue       2
29   sue       3
30   sue       4
31   sue       5
32   sue       6
33   sue       7
34   sue       8
35   sue       9
36   tom       5
37   tom       6
38   tom       7
39   tom       8
40   tom       9
41   tom      10
42   tom      11
"

Data <- read.table(text=zz, header = TRUE)

第1步 - 添加二元指标

df$all<-ifelse(df$numbers==1, 1,0)
df$allperson<-ave(df$all, df$names, FUN=cumsum)

第二步 - 摆脱没有1作为起始号码的人

df[!df$allperson==0,]

2 个答案:

答案 0 :(得分:1)

如果你想要优雅,我必须推荐包dplyr

library(dplyr)

Data %>%
  group_by(names) %>%
  filter(min(numbers) != 1)

这意味着它的含义:仅过滤记录组(由names定义)的最小numbers值不等于1的记录。

   names numbers
1   mary       4
2   mary       5
3   mary       6
4   mary       7
5   mary       8
6   mary       9
7   mary      10
8   mary      11
9   mary      12
10   sue       2
11   sue       3

答案 1 :(得分:1)

您也可以尝试:

zz1 <-  zz[with(zz, names %in% unique(names)[!!table(zz)[,1]]),]
head(zz1,4)
 #   names numbers
 #1   john       1
 #2   john       2
 #3   john       3
 #4   john       4