R 如何在组中更改ID为的列
如何在组中更改ID为的列 data.frame-like: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 <-
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()
计算索引号。我从你的回答中学到了什么。非常感谢。