簡體   English   中英

在 r 中使用“for”循環和表格

[英]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))][]

另一種方法是使用Mapsprintf函數(來自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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM