使用;至于;在r中循环一个表

使用;至于;在r中循环一个表,r,R,我有以下数据库 library(data.table) dt <- data.table(prod= c("AAAA","BBBB","CCCC"), version= c(4,3,5)) 现在我有了下面的代码,但它只适用于AAAA,而不适用于其他 list <- c() for(i in 1:dt$version){ list[[i]] <- paste0(dt$pr

我有以下数据库

library(data.table)
dt <- data.table(prod= c("AAAA","BBBB","CCCC"),
                 version= c(4,3,5))

现在我有了下面的代码,但它只适用于AAAA,而不适用于其他

list <- c()

for(i in 1:dt$version){
  
  list[[i]] <- paste0(dt$prod,i)
  
}

list使用
rep
+
sequence
+
paste0

> with(dt,paste0(rep(prod,version),sequence(version)))
 [1] "AAAA1" "AAAA2" "AAAA3" "AAAA4" "BBBB1" "BBBB2" "BBBB3" "CCCC1" "CCCC2"
[10] "CCCC3" "CCCC4" "CCCC5"
mapply
+
paste0
+
seq

> with(dt, unlist(mapply(function(x,y) paste0(x,seq(y)), prod,version)))
  AAAA1   AAAA2   AAAA3   AAAA4   BBBB1   BBBB2   BBBB3   CCCC1   CCCC2   CCCC3
"AAAA1" "AAAA2" "AAAA3" "AAAA4" "BBBB1" "BBBB2" "BBBB3" "CCCC1" "CCCC2" "CCCC3"
  CCCC4   CCCC5
"CCCC4" "CCCC5" 

使用
uncount

library(dplyr)
library(tidyr)
library(stringr)
dt %>%
   uncount(version) %>%
   mutate(prod = str_c(prod, rowid(prod)))
-输出

#    prod
# 1: AAAA1
# 2: AAAA2
# 3: AAAA3
# 4: AAAA4
# 5: BBBB1
# 6: BBBB2
# 7: BBBB3
# 8: CCCC1
# 9: CCCC2
#10: CCCC3
#11: CCCC4
#12: CCCC5

或使用
rep

dt[rep(seq_len(.N), version)][, prod := paste0(prod, rowid(prod))][]

另一种方法是使用
Map
sprintf
函数(来自
base
),如下所示

library(data.table)

dt <- data.table(prod = c("AAAA","BBBB","CCCC"),
                 version = c(4,3,5))

dt[, .(result = unlist(
         Map(f = function(x, y) sprintf("%s%d", x, seq(from = 1, to = y)),
             prod, version)
       ))]
#     result
#  1:  AAAA1
#  2:  AAAA2
#  3:  AAAA3
#  4:  AAAA4
#  5:  BBBB1
#  6:  BBBB2
#  7:  BBBB3
#  8:  CCCC1
#  9:  CCCC2
# 10:  CCCC3
# 11:  CCCC4
# 12:  CCCC5

一个
dplyr
选项:

library(dplyr)

dt %>%
  slice(rep(row_number(), version)) %>%
  group_by(prod) %>%
  mutate(prod = paste0(prod, row_number())) %>%
  select(-version)

#   prod 
#   <chr>
# 1 AAAA1
# 2 AAAA2
# 3 AAAA3
# 4 AAAA4
# 5 BBBB1
# 6 BBBB2
# 7 BBBB3
# 8 CCCC1
# 9 CCCC2
#10 CCCC3
#11 CCCC4
#12 CCCC5
库(dplyr)
dt%>%
切片(代表(行号(),版本))%>%
分组依据(产品)%>%
突变(prod=paste0(prod,row_number())%>%
选择(-version)
#刺激
#   
#1 AAAA1
#2 AAAA2
#3 AAAA3
#4 AAAA4
#5 BBBB1
#6 BBBB2
#7 BBBB3
#8 CCCC1
#9 CCCC2
#10 CCCC3
#11 CCCC4
#12 CCCC5
with(dt, c(
         Map(f = function(x, y) sprintf("%s%d", x, seq(from = 1, to = y)),
             prod, version),
         recursive = TRUE, use.names = FALSE
       ))
#  [1] "AAAA1" "AAAA2" "AAAA3" "AAAA4" "BBBB1" "BBBB2" "BBBB3" "CCCC1" "CCCC2"
# [10] "CCCC3" "CCCC4" "CCCC5"
library(dplyr)

dt %>%
  slice(rep(row_number(), version)) %>%
  group_by(prod) %>%
  mutate(prod = paste0(prod, row_number())) %>%
  select(-version)

#   prod 
#   <chr>
# 1 AAAA1
# 2 AAAA2
# 3 AAAA3
# 4 AAAA4
# 5 BBBB1
# 6 BBBB2
# 7 BBBB3
# 8 CCCC1
# 9 CCCC2
#10 CCCC3
#11 CCCC4
#12 CCCC5