我有一个带有两个变量的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,]
答案 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