用dplyr按Video.ID汇总数据时,如何正确获取重复的Category值
在dplyr分组汇总中获取重复的单一分类值
你说得太对了——mean(Category)完全是错误的操作,不仅因为Category是字符型(mean根本不适用),更关键是每个Video.ID对应的Category本来就是重复的单一值,我们只需要提取这个固定值就行。这里有几个简单又高效的方法:
方法1:使用first()或last()提取组内首个/末尾值
因为每个分组里的Category值完全一致,直接取组内第一个或者最后一个元素就可以得到正确的分类:
small %>% group_by(Video.ID) %>% summarise( sumr = sum(Partner.Revenue), len = first(Video.Duration..sec.), # 这里也可以用first代替mean,更高效 cat = first(Category) )
同理,last(Category)也能得到一样的结果,选哪个全凭个人习惯。
方法2:用unique()提取唯一值
既然每个分组里的Category只有唯一的一个值(只是重复出现),unique()会直接返回这个唯一的字符串:
small %>% group_by(Video.ID) %>% summarise( sumr = sum(Partner.Revenue), len = mean(Video.Duration..sec.), cat = unique(Category) )
方法3:先提取元数据再合并(适合多固定属性场景)
如果你的数据里,Video.ID不仅对应固定的Category,还对应固定的Video.Duration..sec.,可以先把这些固定的元数据提取出来,再和统计结果合并,这样代码更清晰,也避免重复写提取逻辑:
# 提取每个Video.ID对应的固定属性 video_metadata <- small %>% distinct(Video.ID, Category, Video.Duration..sec.) # 计算需要汇总的统计量 video_summary <- small %>% group_by(Video.ID) %>% summarise( sumr = sum(Partner.Revenue), total_owned_views = sum(Owned.Views) # 可以按需添加更多统计项 ) # 合并元数据和统计结果 left_join(video_summary, video_metadata, by = "Video.ID")
额外提一句:你的Video.Duration..sec.在每个分组里也是固定值,用first()代替mean()会更高效,毕竟没必要对完全相同的数值计算均值~
内容的提问来源于stack exchange,提问作者hmmmbob
相关产品推荐
相关产品推荐

