在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
相关产品推荐
相关产品推荐

