我有一个有两个变量的df,一个有I,另一个有一个名为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,]发布于 2014-07-09 16:06:02
如果您想要优雅,我必须推荐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发布于 2014-07-09 16:57:11
你也可以尝试:
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 4https://stackoverflow.com/questions/24657584
复制相似问题