[英]Using “for” loop in r with a table
我有以下數據庫
library(data.table)
dt <- data.table(prod= c("AAAA","BBBB","CCCC"),
version= c(4,3,5))
我想得到這個
AAAA1
AAAA2
AAAA3
AAAA4
BBBB1
BBBB2
BBBB3
CCCC1
CCCC2
CCCC3
CCCC4
CCCC5
現在我有以下代碼,但它只適用於 AAAA,但不適用於 rest
list <- c()
for(i in 1:dt$version){
list[[i]] <- paste0(dt$prod,i)
}
使用rep
+ sequence
+ paste0
的基本 R 選項
> 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
或者
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"
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.