我創建了一個資料框,其中包含一個組列和一個單獨的識別符號,其中包含組名和一個格式化為標準化三位數代碼的數字:
library(stringr)
group = rep(c("A", "B", "C"), each = 3)
df <- data.frame(group, indiv = paste(group, str_pad(1:9, pad = 0, width = 3 , "left"), sep = ""))
一切都很好,但是每次有新前綴時我將如何重置單個識別符號,以獲得理想的結果:
df2 <- data.frame(group, indiv = c("A001", "A002", "A003",
"B001", "B002", "B003",
"C001", "C002", "C003"))
uj5u.com熱心網友回復:
我們可以按'group'分組,用于substr從'indiv'中提取第一個字符并用于sprintf格式化序列(row_number())
library(dplyr)
df %>%
group_by(group) %>%
mutate(indiv = sprintf('%sd', substr(indiv, 1, 1), row_number())) %>%
ungroup
-輸出
# A tibble: 9 × 2
group indiv
<chr> <chr>
1 A A001
2 A A002
3 A A003
4 B B001
5 B B002
6 B B003
7 C C001
8 C C002
9 C C003
或緊湊地與 data.table
library(data.table)
setDT(df)[, indiv := sprintf('%sd', group, rowid(group))]
或使用 base R
df$indiv <- with(df, sprintf('%sd', group,
ave(seq_along(group), group, FUN = seq_along)))
uj5u.com熱心網友回復:
另一個基本的 R 解決方案:
df <- data.frame(group,
indiv = paste(group, str_pad(rep(1:3, 3),
pad = 0, width = 3 , "left"), sep = ""))
uj5u.com熱心網友回復:
這是使用 akrun 的另一種方法 sprintf
library(dplyr)
df %>%
group_by(group) %>%
mutate(indiv = paste0(group, sprintf("d", row_number())))
輸出:
group indiv
<chr> <chr>
1 A A001
2 A A002
3 A A003
4 B B001
5 B B002
6 B B003
7 C C001
8 C C002
9 C C003
uj5u.com熱心網友回復:
你可以sprintf()在里面單獨使用mutate:
library(dplyr)
df |>
group_by(group) |>
mutate(indiv = sprintf("%sd", group, 1:n()))
%s: 字串,在本例中為group。
d:將 3 個前導零添加到整數 ( %d),在本例中為分組中的行號。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/392719.html
