R 如何在组中更改ID为的列

R 如何在组中更改ID为的列,r,dplyr,R,Dplyr,如何在组中更改ID为的列 data.frame-like: a b c 1 a 1 1 2 a 1 2 3 a 2 3 4 b 1 4 5 b 2 5 6 b 3 6 按a分组,标志以1开头,如果b等于前b,则标志=1,否则标志+=1 a b c flag 1 a 1 1 1 <- group a start with 1 2 a 1 2 1 <-- in group a, 1(in row 2)=1(in row 1) 3 a 2 3 2 <-

如何在组中更改ID为的列

data.frame-like:

a b c
1 a 1 1
2 a 1 2
3 a 2 3
4 b 1 4
5 b 2 5
6 b 3 6
按a分组,标志以1开头,如果b等于前b,则标志=1,否则标志+=1

  a b c flag
1 a 1 1    1  <-  group a start with 1
2 a 1 2    1  <-- in group a, 1(in row 2)=1(in row 1)
3 a 2 3    2  <-  in group a, 2(in row 3)!=1(in row 2)
4 b 1 4    1  <-  group b start with 1
5 b 2 5    2  <-  in group b, 2(in row 5)!=1(in row 4)
6 b 3 6    3  <-  in group b, 3(in row 6)!=2(in row 5)
abc标志
我现在用这个:

for(i in 2:nrow(x)){
    x[i, 'flag'] = ifelse(x[i, 'a']!=x[i-1,'a'], 1, ifelse(x[i, 'b']==x[i-1, 'b'], x[i-1, 'flag'], x[i-1,'flag']+1))
}
但在大数据集上,这种方法效率低下

# 更新 dplyr中的稠密等级给我答案

> x %>% group_by(a) %>% mutate(dense_rank(b))
Source: local data frame [10 x 4]
Groups: a

   a b  c dense_rank(b)
1  a x  1             1
2  a x  2             1
3  a y  3             2
4  b x  4             1
5  b y  5             2
6  b z  6             3
7  c x  7             1
8  c y  8             2
9  c z  9             3
10 c z 10             3
谢谢。

我现在用这个:

for(i in 2:nrow(x)){
    x[i, 'flag'] = ifelse(x[i, 'a']!=x[i-1,'a'], 1, ifelse(x[i, 'b']==x[i-1, 'b'], x[i-1, 'flag'], x[i-1,'flag']+1))
}
但在大数据集上,这种方法效率低下

# 更新 dplyr中的稠密等级给我答案

> x %>% group_by(a) %>% mutate(dense_rank(b))
Source: local data frame [10 x 4]
Groups: a

   a b  c dense_rank(b)
1  a x  1             1
2  a x  2             1
3  a y  3             2
4  b x  4             1
5  b y  5             2
6  b z  6             3
7  c x  7             1
8  c y  8             2
9  c z  9             3
10 c z 10             3

谢谢。

我不完全确定你想做什么。但在我看来,您试图为每个组(a或b)的b中的值分配索引号

#我在这里修改了您的示例。

a我不完全确定你想做什么。但在我看来,您试图为每个组(a或b)的b中的值分配索引号

#我在这里修改了您的示例。

aHers是解决这个问题的一种快速矢量化方法,无需对
循环使用任何

使用
ave
transform

transform(x, flag = ave(b, a, FUN = function(x) cumsum(c(1, diff(x)))))
#   a b c flag
# 1 a 1 1    1
# 2 a 1 2    1
# 3 a 2 3    2
# 4 b 1 4    1
# 5 b 2 5    2
# 6 b 3 6    3
数据表
解决方案(更高效)

或者一个
dplyr
解决方案(因为您标记了它)


这是一种快速矢量化的解决方法,无需对循环使用任何

使用
ave
transform

transform(x, flag = ave(b, a, FUN = function(x) cumsum(c(1, diff(x)))))
#   a b c flag
# 1 a 1 1    1
# 2 a 1 2    1
# 3 a 2 3    2
# 4 b 1 4    1
# 5 b 2 5    2
# 6 b 3 6    3
数据表
解决方案(更高效)

或者一个
dplyr
解决方案(因为您标记了它)


这是一个位电报(或twitter)样式,示例中有一个错误,但除此之外,这是一个定义良好的问题。我唯一错过的是一句“我试过了,但没有成功”。这是一种电报(或推特)风格,示例中有一个错误,但除此之外,这是一个定义良好的问题。我唯一错过的是一句“我试过了,但没用”。对不起,我没有把我的问题说清楚。列b可以是类似c的字符('a','a','b','a','b','c')。不过还是谢谢你。我使用
x%>%mutate(densite\u rank(b))
来解决这个问题。将其粘贴到数据帧中的最快方法是
x$flag=densite\u rank(x$b)
,您不需要任何管道。谢谢您的回答。我找不到如何使用
mutate()
计算索引号。我从你的回答中学到了什么。谢谢。对不起,我没有把问题说清楚。列b可以是类似c的字符('a','a','b','a','b','c')。不过还是谢谢你。我使用
x%>%mutate(densite\u rank(b))
来解决这个问题。将其粘贴到数据帧中的最快方法是
x$flag=densite\u rank(x$b)
,您不需要任何管道。谢谢您的回答。我找不到如何使用
mutate()
计算索引号。我从你的回答中学到了什么。非常感谢。