如何创建按字母与序号递增规则命名的列名
需求背景
我有一组命名复杂的波兰语列头,结构呈现规律:以Proszę(含拼写变体Prosze)开头的主列后,会跟随一组对应的子列。需要实现以下重命名规则:
- 所有主列依次命名为「Primary A」「Primary B」「Primary C」…
- 对应主列的子列依次命名为「Second A1」「Second A2」…「Second B1」「Second B2」…
列头示例
[1] "Proszę podać, ile godzin dziennie oglądasz zazwyczaj treści VIDEO wymienione wyżej, BEZ PRZERYWANIA INNĄ AKTYWNOSCIĄ.\n"
[2] "oglądanie treści video, w tym granie w gry video, itp....12"
[3] "słuchanie muzyki, audycji radiowych, podcastów, audiobooków, itp....13"
[4] "edukacja - czytanie lub wykonywanie zadań związanych ze szkołą/studiami, itp. "
[5] "pisanie e-maili lub wysyłanie postów w social mediach, itp. "
[6] "wysyłanie SMS lub korzystanie z komunikatorów internetowych i czatów, itp. "
[7] "rozmowa przez telefon lub komunikator video, itp. "
[8] "Proszę podać, ile godzin dziennie słuchasz zazwyczaj treści AUDIO wymienione wyżej, BEZ PRZERYWANIA INNĄ AKTYWNOSCIĄ. \n"
[9] "oglądanie treści video, w tym granie w gry video, itp....19"
[10] "słuchanie muzyki, audycji radiowych, podcastów, audiobooków, itp.2"
数据集示例(R结构)
structure(list(`Prosze podac, ile godzin dziennie korzystasz zazwyczaj z materialów do CZYTANIA wymienionych wyzej, BEZ PRZERYWANIA INNA AKTYWNOSCIA. ` = "mniej niz 1 godzine", `ogladanie tresci video, w tym granie w gry video, itp.2` = "nigdy", `sluchanie muzyki, audycji radiowych, podcastów, audiobooków, itp.3` = "okolo 3- 4 godzin", `czytanie lub wykonywanie zadan zwiazanych ze szkola/studiami, itp.2` = "okolo 1-2 godzin", `pisanie e-maili lub wysylanie postów w social mediach, itp.2` = "mniej niz 1 godzine", `wysylanie SMS lub korzystanie z komunikatorów internetowych i czatów, itp.2` = "okolo 1-2 godzin", `rozmowa przez telefon lub komunikator video, itp.2` = "nigdy", `Prosze podac, ile godzin dziennie spedzasz zazwyczaj na czytaniu i pisaniu MAILE I POSTY na social mediach wymienionych wyzej, BEZ PRZERYWANIA INNA AKTYWNOSCIA. ` = "mniej niz 1 godzine", `ogladanie tresci video, w tym granie w gry video, itp.3` = "nigdy", `sluchanie muzyki, audycji radiowych, podcastów, audiobooków, itp....34` = "okolo 2-3 godzin"), row.names = c(NA, -1L), class = c("tbl_df", "tbl", "data.frame"))
R代码实现
# 加载dplyr(可选,仅用于数据查看) library(dplyr) # 加载示例数据集(如果已有数据集可跳过此步) MMT_sample <- structure(list(`Prosze podac, ile godzin dziennie korzystasz zazwyczaj z materialów do CZYTANIA wymienionych wyzej, BEZ PRZERYWANIA INNA AKTYWNOSCIA. ` = "mniej niz 1 godzine", `ogladanie tresci video, w tym granie w gry video, itp.2` = "nigdy", `sluchanie muzyki, audycji radiowych, podcastów, audiobooków, itp.3` = "okolo 3- 4 godzin", `czytanie lub wykonywanie zadan zwiazanych ze szkola/studiami, itp.2` = "okolo 1-2 godzin", `pisanie e-maili lub wysylanie postów w social mediach, itp.2` = "mniej niz 1 godzine", `wysylanie SMS lub korzystanie z komunikatorów internetowych i czatów, itp.2` = "okolo 1-2 godzin", `rozmowa przez telefon lub komunikator video, itp.2` = "nigdy", `Prosze podac, ile godzin dziennie spedzasz zazwyczaj na czytaniu i pisaniu MAILE I POSTY na social mediach wymienionych wyzej, BEZ PRZERYWANIA INNA AKTYWNOSCIA. ` = "mniej niz 1 godzine", `ogladanie tresci video, w tym granie w gry video, itp.3` = "nigdy", `sluchanie muzyki, audycji radiowych, podcastów, audiobooków, itp....34` = "okolo 2-3 godzin"), row.names = c(NA, -1L), class = c("tbl_df", "tbl", "data.frame")) # 获取所有列名 col_names <- colnames(MMT_sample) # 定位所有主列(匹配开头的Proszę/Prosze,保留大小写以确保准确) primary_positions <- grep("^Prosz(e|ę)", col_names) # 生成主列的分组标识(A、B、C...) group_tags <- LETTERS[seq_along(primary_positions)] # 初始化新列名向量 new_col_names <- character(length(col_names)) # 遍历每个主列,为其及对应子列命名 for (idx in seq_along(primary_positions)) { # 命名当前主列 new_col_names[primary_positions[idx]] <- paste0("Primary ", group_tags[idx]) # 确定当前主列对应的子列范围 if (idx < length(primary_positions)) { sub_start <- primary_positions[idx] + 1 sub_end <- primary_positions[idx + 1] - 1 } else { sub_start <- primary_positions[idx] + 1 sub_end <- length(col_names) } # 为子列命名 if (sub_start <= sub_end) { sub_numbers <- seq_len(sub_end - sub_start + 1) new_col_names[sub_start:sub_end] <- paste0("Second ", group_tags[idx], sub_numbers) } } # 应用新列名 colnames(MMT_sample) <- new_col_names # 查看重命名后的结果 MMT_sample
代码说明
- 主列定位:通过
grep精准匹配以Proszę或Prosze开头的列,兼容拼写变体; - 分组标识:使用大写字母序列为每个主列分配唯一分组标签;
- 子列范围划分:自动识别每个主列对应的子列区间(当前主列下一个位置到下一个主列前一个位置,最后一组子列到数据集末尾);
- 批量命名:主列统一命名为「Primary X」,子列命名为「Second Xn」(X为分组字母,n为子列序号)。
内容的提问来源于stack exchange,提问作者12666727b9

