使用;至于;在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