dplyr::group_by影响向量列致报错:每组仅含一个观测值
解决dplyr group_by处理data.table向量列的问题
我明白你遇到的困扰了——当你给animal_frame添加num_entry索引列后,想用dplyr::group_by操作时,却触发了“Each group consists of only one observation...”的错误,核心问题出在向量列first_and_last的分组逻辑上。
问题根源
dplyr的group_by默认会把每一行的完整向量(比如c(1,2)、c(2,2))当作独立的分组键。而你的数据里,大多数行的first_and_last向量都是唯一的,自然就会出现“每组只有一个观测”的情况,完全不符合你“每个num_entry对应两个点”的需求。
解决方案:先拆分向量列
要实现每个num_entry对应两个点的目标,我们需要先把first_and_last里的向量元素拆成单独的行,这样每个num_entry就会对应两行数据,之后再分组就正常了。下面提供两种常用的实现方式:
方式1:用dplyr + tidyr链式操作
library(dplyr) library(tidyr) library(data.table) # 先拆分向量列为多行,再进行分组操作 processed_data <- animal_frame %>% # 将first_and_last的向量拆分成独立行,保留其他列的对应值 unnest_longer(col = first_and_last) %>% # 现在可以按num_entry正常分组了 group_by(num_entry) %>% # 这里可以添加你的后续操作,比如查看每组的观测数(应该都是2) summarise( total_points = n(), unique_animals = n_distinct(animal) ) print(processed_data)
方式2:用data.table原生语法拆分
如果你更习惯data.table的操作风格,可以这样拆分向量列:
# 按每行的行号拆分first_and_last向量,生成新的行 processed_dt <- animal_frame[, .(first_and_last = unlist(first_and_last), animal, color, num_entry), by = .(row_id = seq_len(nrow(animal_frame))) ] # 之后按num_entry分组操作 processed_dt[, .(total_points = .N), by = num_entry]
验证效果
拆分完成后,每个num_entry对应两行数据,分别对应原first_and_last向量的两个元素,此时再用group_by就不会出现“每组仅一个观测”的错误,完全符合你绘制x轴为num_entry、y轴为first_and_last的双点需求。
内容的提问来源于stack exchange,提问作者AmagicalFishy
相关产品推荐
相关产品推荐

