标记第一次基于参数的记录出现在r数据帧中

时间:2018-05-02 15:53:28

标签: r sorting head

我有一个包含多个列的数据框df

数据框已按联系人ID C_ID排序。 C_ID可以在数据框中多次出现。我想把一个" X" MainRecord列中的第C_ID列,以便结果如下:

C_ID  Name  MainRecord
1     JM    X
1     JM  
1     JM  
2     DM    X
3     TY    X
3     TY

我认为我的解决方案需要引用head函数:df[,head(1)]

1 个答案:

答案 0 :(得分:3)

我们可以按“C_ID”,“姓名”进行分组,然后使用case_when

创建“MainRecord”
library(dplyr)
df1 %>%
  group_by(C_ID, Name) %>%
  mutate(MainRecord = case_when(row_number()==1 ~ "X", TRUE ~ ""))
# A tibble: 6 x 3
# Groups:   C_ID, Name [3]
#   C_ID Name  MainRecord
#  <int> <chr> <chr>     
#1     1 JM    X         
#2     1 JM    ""        
#3     1 JM    ""        
#4     2 DM    X         
#5     3 TY    X         
#6     3 TY    ""        

或另一个选项是ifelse

df1 %>%
   group_by(C_ID, Name) %>% 
   mutate(MainRecord = ifelse(row_number()==1, "X", ""))

或使用索引

df1 %>% 
   group_by(C_ID, Name) %>% 
   mutate(MainRecord = c("", "X")[(row_number()==1) + 1])

或者使用data.table,使用.I获取行索引,并为(:=)分配与行对应的“X”值

library(data.table)
i1 <- setDT(df1)[, .I[seq_len(.N) == 1], .(C_ID, Name)]$V1
df1[i1, MainRecord := "X"]

base R

i1 <- with(df1, ave(seq_along(C_ID), C_ID, Name, FUN = seq_along)==1)
df1$MainRecord[i1] <- "X"