在R语言dplyr中按分组提取首个观测值并创建列表列的技术咨询
解决dplyr分组生成首行观测值列表列的问题
我来帮你搞定这个问题~你之前的代码出错是因为slice(1)在mutate里返回的是整个行的tibble对象,而不是我们需要的数值向量,所以没法直接生成你想要的列表列。下面给你两种正确的实现方式:
方法一:明确指定列生成向量
如果你的目标列固定(比如只有col1和col2),可以用first()函数提取每组第一行的对应值,再组合成向量放进列表:
library(dplyr) # 你的示例数据 df <- structure(list(Grp = c("A", "A", "A", "B", "B"), col1 = c(1, 2, 3, 70, 80), col2 = c(4, 5, 6, 100, 110)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -5L)) # 生成目标列表列 result <- df %>% group_by(Grp) %>% mutate(L = list(c(first(col1), first(col2)))) %>% ungroup() # 查看结果 result
运行后输出的结果如下,L列的每个元素都是你想要的数值向量:
# A tibble: 5 × 4 Grp col1 col2 L <chr> <dbl> <dbl> <list> 1 A 1 4 <dbl [2]> 2 A 2 5 <dbl [2]> 3 A 3 6 <dbl [2]> 4 B 70 100 <dbl [2]> 5 B 80 110 <dbl [2]>
验证一下:result$L[[1]]会返回c(1, 4),result$L[[4]]返回c(70, 100),完全符合你的需求。
方法二:自动提取所有非分组列的首行值
如果以后你的数据列变多,不想手动指定列名,可以用cur_data()获取当前组的非分组列数据,再提取首行转成向量:
result <- df %>% group_by(Grp) %>% mutate(L = list(as.vector(slice_head(cur_data(), n = 1)))) %>% ungroup()
这个方法会自动把每组第一行的所有非分组列(这里就是col1和col2)转成向量,放进列表列里,扩展性更强。
为什么你的原代码会出错?
你之前写的mutate(L = list(slice(1))),slice(1)在分组环境下返回的是一行的tibble(比如组A的slice(1)是tibble(col1=1, col2=4)),而不是数值向量。所以list(slice(1))会让L列的每个元素都是一个小tibble,而不是你需要的c(1,4)这样的简单向量,这就是报错的原因。
内容的提问来源于stack exchange,提问作者Omry Atia
相关产品推荐
相关产品推荐

