Skip to main content
 首页 » 编程设计

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

2024年05月22日464kerrycode

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

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

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

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

请您参考如下方法:

我们可以按“C_ID”、“Name”进行分组,并使用 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"] 
<小时 />

或者使用基础R

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