R 数据帧中的条件计数

R 数据帧中的条件计数,r,dataframe,R,Dataframe,我有一个数据帧(df),其结构如下 ID person_id person_type proof_id A1 P1 applicant A1321 A1 P1 applicant A423412 A1 P1 applicant W352352 A1 P2 co_applicant D43252 A1 P2 co_applicant G43222 A2 P5 applic

我有一个数据帧(df),其结构如下

ID person_id person_type    proof_id
A1 P1        applicant      A1321
A1 P1        applicant      A423412
A1 P1        applicant      W352352
A1 P2        co_applicant   D43252
A1 P2        co_applicant   G43222
A2 P5        applicant      K5647
A2 P5        applicant      Pu7e5
A2 P6        co_applicant   L032u4
A2 P7        co_applicant   Q3344
我正在尝试添加另一个栏来区分两人申请者

ID person_id person_type    proof_id    final
A1 P1        applicant      A1321       applicant1
A1 P1        applicant      A423412     applicant1
A1 P1        applicant      W352352     applicant1
A1 P2        co_applicant   D43252      co_applicant1
A1 P2        co_applicant   G43222      co_applicant1
A2 P5        applicant      K5647       applicant1
A2 P5        applicant      Pu7e5       applicant1
A2 P6        co_applicant   L032u4      co_applicant1
A2 P7        co_applicant   Q3344       co_applicant2
我对以下内容感到厌倦,但每行都会增加:

df <- df %>% group_by(ID, person_type, person_id ) %>% 
  mutate(final = paste(person_type, 1:n()))
df%分组依据(ID、人员类型、人员ID)%>%
mutate(final=粘贴(person\u type,1:n())

您当然只希望按
ID
人员类型进行分组:

library(data.table)

setDT(df)[, final:=paste0(person_type,1:length(unique(person_id))),.(ID, person_type)]
使用
dplyr
可以使用
n_distinct

df %>% 
    group_by(ID, person_type) %>% 
    mutate(final=paste0(person_type, 1:n_distinct(person_id)))

您当然只希望按
ID
person\u type
进行分组:

library(data.table)

setDT(df)[, final:=paste0(person_type,1:length(unique(person_id))),.(ID, person_type)]
使用
dplyr
可以使用
n_distinct

df %>% 
    group_by(ID, person_type) %>% 
    mutate(final=paste0(person_type, 1:n_distinct(person_id)))

您可以将
数据.table
?rleid一起使用:

library(data.table)
setDT(df)[,final := paste0(person_type, rleid(person_id)), 
           by = c("ID", "person_type")]
> df
   ID person_id  person_type proof_id         final
1: A1        P1    applicant    A1321    applicant1
2: A1        P1    applicant  A423412    applicant1
3: A1        P1    applicant  W352352    applicant1
4: A1        P2 co_applicant   D43252 co_applicant1
5: A1        P2 co_applicant   G43222 co_applicant1
6: A2        P5    applicant    K5647    applicant1
7: A2        P5    applicant    Pu7e5    applicant1
8: A2        P6 co_applicant   L032u4 co_applicant1
9: A2        P7 co_applicant    Q3344 co_applicant2

您可以将
数据.table
?rleid一起使用:

library(data.table)
setDT(df)[,final := paste0(person_type, rleid(person_id)), 
           by = c("ID", "person_type")]
> df
   ID person_id  person_type proof_id         final
1: A1        P1    applicant    A1321    applicant1
2: A1        P1    applicant  A423412    applicant1
3: A1        P1    applicant  W352352    applicant1
4: A1        P2 co_applicant   D43252 co_applicant1
5: A1        P2 co_applicant   G43222 co_applicant1
6: A2        P5    applicant    K5647    applicant1
7: A2        P5    applicant    Pu7e5    applicant1
8: A2        P6 co_applicant   L032u4 co_applicant1
9: A2        P7 co_applicant    Q3344 co_applicant2