【问题标题】:flagging the first time a record based on parameter appears in r dataframe标记基于参数的记录第一次出现在 r 数据帧中
【发布时间】:2018-05-02 15:53:28
【问题描述】:

我有一个数据框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)]

【问题讨论】:

  • 这里有一些其他方法(尽管如果你仍然想这样做,你仍然必须将 0/1 映射到空白/X):stackoverflow.com/q/26265732

标签: r sorting 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"]

或者base R

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

【讨论】:

  • data.table 一的单行版本:df1[!duplicated(df1, by=c("C_ID", "Name")), MainRecord := "X"],因为 duplicated.data.table 有一个 by= arg。
猜你喜欢
  • 2021-11-21
  • 1970-01-01
  • 2021-07-08
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 2021-08-06
  • 2021-11-25
  • 1970-01-01
相关资源
最近更新 更多