标记第一次基于参数的记录出现在 r 数据帧中
flagging the first time a record based on parameter appears in r dataframe
我有一个包含多列的数据框 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"]
或 base R
i1 <- with(df1, ave(seq_along(C_ID), C_ID, Name, FUN = seq_along)==1)
df1$MainRecord[i1] <- "X"
我有一个包含多列的数据框 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
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
获取行索引并分配 (:=
) 对应于行
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"