You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R语言中按固定行间隔为数据框添加分类变量

问题描述

我有如下的data.frame:

Q1 <- c("A",NA,"A",NA,"NA","C","D","A","B", NA) 
Q2 <- c("D",NA,"D","C",NA,NA,"A","A","A","A")
Q3 <- c("B","B","C","A",NA,"A","B","D","E",NA)
Q4 <- c("B",NA,"C","C","C","C","D","B",NA,"A")
Q5 <- c("A",NA,"D",NA,NA,"C",NA,"B","B", NA)
Q6 <- c("D",NA,"D","C",NA,NA,"A","A","A","A")
mydf <- data.frame(Q1,Q2,Q3,Q4,Q5,Q6)
mydf

我希望为该数据集添加名为subject的新列,按每2行一组分配对应的类别,预期结果如下:

Q1   Q2   Q3   Q4   Q5   Q6    Subject
1     A    D    B    B    A    D   Language
2  <NA> <NA>    B <NA> <NA> <NA>   Language
3     A    D    C    C    D    D   Science
4  <NA>    C    A    C <NA>    C   Science
5    NA <NA> <NA>    C <NA> <NA>   Math 
6     C <NA>    A    C    C <NA>   Math
7     D    A    B    D <NA>    A   Art
8     A    A    D    B    B    A   Art
9     B    A    E <NA>    B    A   History
10 <NA>    A <NA>    A <NA>    A   History

我知道可以用mutate函数添加新列,但不清楚如何指定按固定行间隔来实现该需求。

解决方案

可以通过dplyr的mutate函数结合重复向量或分组函数来实现,以下是两种可行方法:

方法一:直接重复类别向量

这种方法适用于数据行数刚好是类别数×每组行数的情况:

library(dplyr)

# 定义需要分配的类别
subject_list <- c("Language", "Science", "Math", "Art", "History")

# 添加Subject列
mydf <- mydf %>%
  mutate(Subject = rep(subject_list, each = 2))
  • rep(subject_list, each = 2):将每个类别重复2次,生成与数据行数匹配的向量,直接赋值给新列。

方法二:用gl()生成分组标识

如果数据行数有变动,或者需要更灵活的分组控制,可使用gl()函数生成分组因子,再匹配类别:

library(dplyr)

subject_list <- c("Language", "Science", "Math", "Art", "History")

mydf <- mydf %>%
  # 生成每组2行的分组因子,共5个分组
  mutate(group_id = gl(n = length(subject_list), k = 2),
         # 根据分组因子匹配对应类别
         Subject = subject_list[group_id]) %>%
  # 可选:移除中间分组列
  select(-group_id)
  • gl(n, k):n为分组总数,k为每组的行数,生成的因子可用来映射对应的类别。

内容的提问来源于stack exchange,提问作者dplyr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:20:37