Apply函数中的条件语句在R中无法正常工作

问题描述 投票:0回答:2

我有一个数据框,其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都有订单号。

r if-statement apply
2个回答
0
投票

您必须使用功能吗?如果没有:

`id

频率

num

数据

data2 %过滤器(频率== 1)%>%mutate(newid = id)

data3 %filter(freq!= 1)%>%mutate(newid = paste(id,freq,sep =“-”))

结果%排列(num)`


0
投票

您可以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
© www.soinside.com 2019 - 2024. All rights reserved.