[英]Add counter for Matching ID based on value in another column in R
我正在努力思考我需要什么逻辑才能为正版比赛和非正版比赛拿出一个计数器/索引。 我的数据的简化示例如下:
ID track
x 10
x 10
x 3
x 3
x 1
y 2
我希望得到的最终数据框如下:
ID Track Counter
x 10 1
x 10 1
x 3 2
x 3 2
x 1 3
y 2 1
因此,每当ID相同且轨道相同时,在计数器列中放置一个计数器(从1开始),每当ID相同但随后轨道更改使计数器+1,等等。当新ID出现时柜台再次从1开始。
任何建议都会很棒。
你可以用
library(tidyverse)
data %>% group_by(ID) %>% mutate(Counter = cumsum(!duplicated(track)))
诀窍是使用duplicated
表示看不见的条目和cumsum
作为他们的计数器。 例如,
!duplicated(data$track[1:5])
# [1] TRUE FALSE TRUE FALSE TRUE
如果你没有重复的曲目,@ Julius的回答是有效的。 如果遇到轨道可能恢复到先前值的情况,则计数器不会递增。 如果你的数据是这种情况,并且你需要在发生这种情况时递增计数器,我建议使用dplyr的lag
。
library(dplyr)
df %>% group_by(ID) %>% mutate(count = cumsum(track != lag(track, default = track[1]))+1)
结果还有几个数据点:
# A tibble: 8 x 3
# Groups: ID [2]
# ID track count
# <fct> <int> <dbl>
# 1 x 10 1
# 2 x 10 1
# 3 x 3 2
# 4 x 3 2
# 5 x 1 3
# 6 x 3 4
# 7 x 3 4
# 8 y 2 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.