我有一个数据框,其ID列具有许多重复的名称。因此,我使用table()函数来获取ID的频率。像这样:
library(dplyr)
id <- runif(1000,1000,3000) %>% round() %>% as.character()
freq <- rep(1:50,20)
data <- data.frame(id,freq)
GetID <- function(a){
if (a[2]==1) newid <- a[1] else newid <- paste(a[1],1:a[2],sep = "-");
return(newid)}
idlist <- data %>% apply(., 1, GetID)
idlist2 <- unlist(idlist) %>% as.data.frame()
我想获得一个新的ID向量。如果频率等于1,则新ID等于旧ID。如果频率大于1,则新ID为旧ID及其顺序。但是,似乎if语句无法正常工作。所有新ID都有订单号。
您必须使用功能吗?如果没有:
`id
频率
num
数据
data2 %过滤器(频率== 1)%>%mutate(newid = id)
data3 %filter(freq!= 1)%>%mutate(newid = paste(id,freq,sep =“-”))
结果%排列(num)`
您可以group_by
id
,并且如果行数大于1,则将row_number()
粘贴到id
或仅使用id
。
library(dplyr)
data %>%
group_by(id) %>%
mutate(newID = if(n() > 1) paste(id, row_number(), sep = '-')
else as.character(id)) %>%
arrange(id)
# id freq newID
# <chr> <int> <chr>
# 1 1002 49 1002-1
# 2 1002 31 1002-2
# 3 1003 26 1003
# 4 1005 11 1005-1
# 5 1005 28 1005-2
# 6 1007 37 1007
# 7 1013 33 1013
# 8 1016 7 1016
# 9 1020 11 1020
#10 1024 28 1024
# … with 990 more rows