如何基于嵌套列内的参数对R语言DataFrame进行数据整理?
问题描述
假设我们有如下DataFrame:
a = c(rep(1,5),rep(0,5),rep(1,5),rep(0,5)) b = c(rep(4,5),rep(3,5),rep(2,5),rep(1,5)) c = c(rep("w",5),rep("x",5),rep("y",5),rep("z",5)) df = data.frame(a,b,c) df = df %>% nest(data=c(a,b))
我希望利用嵌套的data列中的参数对整个DataFrame进行操作,例如:
- 使用
filter()剔除嵌套data列中a列求和为0的行 - 依据b列的
max()值对DataFrame行进行排序
我自己想到了一种笨拙的实现方法,但不适用于大型数据集:
sum_column = function(df){ df = df %>% summarize(value=sum(a)) return(df[[1]][1]) } #新增a列求和的列后再筛选 df = df %>% mutate(sum_of_a = map(data, ~sum_column(.x))) %>% filter(!sum_of_a==0)
请问该如何高效实现上述需求?
高效实现方案
1. 直接在filter中筛选(无中间列)
不需要额外新增列,用map_lgl直接返回逻辑值供filter使用,避免中间列占用内存,适合大型数据集:
library(tidyverse) # 剔除data中a列求和为0的行 df_filtered <- df %>% filter(map_lgl(data, ~sum(.x$a) != 0))
2. 依据嵌套列统计量排序
用map_dbl提取每个嵌套data中b列的最大值,直接传入arrange完成排序,同样无需额外列:
# 按data中b列的最大值降序排序 df_sorted <- df %>% arrange(desc(map_dbl(data, ~max(.x$b))))
3. 一次性提取多统计量(按需使用)
如果后续需要复用多个嵌套列的统计值,可一次性提取,但仅在确实需要保留这些值时使用,避免不必要的内存消耗:
df_stats <- df %>% mutate( sum_a = map_dbl(data, ~sum(.x$a)), max_b = map_dbl(data, ~max(.x$b)) ) %>% filter(sum_a != 0) %>% arrange(desc(max_b))
内容的提问来源于stack exchange,提问作者Alex Markov
相关产品推荐
相关产品推荐

