我有以下代码,我需要调整它,因为输出不是 100% 正确:
df = read.table(text='colA colB colC
10 11 7
10 34 7
10 89 7
10 21 7
9 8 0
9 11 0
9 21 0
2 23 5
2 21 5
2 56 5
1 45 0
1 23 0
22 14 3
22 19 3
22 90 3
11 19 2
11 45 2
80 13 2
80 17 2
99 15 1
55 20 1', header = TRUE)
df$ID <-NA
df[1,'ID']<-1
val=1
for (i in 2:nrow(df)){
if (df[i,'colC']!=0 & (df[i,'colC']!=df[i-1,'colC'])) {val=val+1}
df[i,'ID']<-val
}
按照上面的代码输出:
> df
colA colB colC ID
1 10 11 7 1
2 10 34 7 1
3 10 89 7 1
4 10 21 7 1
5 9 8 0 1
6 9 11 0 1
7 9 21 0 1
8 2 23 5 2
9 2 21 5 2
10 2 56 5 2
11 1 45 0 2
12 1 23 0 2
13 22 14 3 3
14 22 19 3 3
15 22 90 3 3
16 11 19 2 4
17 11 45 2 4
18 80 13 2 4
19 80 17 2 4
20 99 15 1 5
21 55 20 1 5
有什么问题是最后 4 个ID
值,它们应该根据行对行进行分组,colC
但是因为每个不同的组之间没有 0,所以colC
数字相同但不同的值colA
被分组在一起,这不是我想要的。
所需的输出(见最后 4 个ID
值):
> df
colA colB colC ID
1 10 11 7 1
2 10 34 7 1
3 10 89 7 1
4 10 21 7 1
5 9 8 0 1
6 9 11 0 1
7 9 21 0 1
8 2 23 5 2
9 2 21 5 2
10 2 56 5 2
11 1 45 0 2
12 1 23 0 2
13 22 14 3 3
14 22 19 3 3
15 22 90 3 3
16 11 19 2 4
17 11 45 2 4
18 80 13 2 5
19 80 17 2 5
20 99 15 1 6
21 55 20 1 7
我该如何解决这个问题?
您需要稍微更改您的条件,因为不同的colA
值会生成新的 ID,colA
需要包含在条件中:
for (i in 2:nrow(df)){
# check the difference of colA here
if (df[i,'colC']!=0 & (df[i,'colA']!=df[i-1,'colA'])) {val=val+1}
df[i,'ID']<-val
}
df$ID
# [1] 1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 4 4 5 5 6 7
或者您可以将其矢量化为:
df$ID <- with(df, cumsum(c(TRUE, diff(colA) != 0 & colC[-1] != 0)))
df$ID
# [1] 1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 4 4 5 5 6 7
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句