如何嵌套tibble?基于hand列嵌套dataframe遇问题求助
嘿,我来帮你搞定这个嵌套的问题~
首先,你遇到的问题和警告其实是因为新版tidyr里的nest()函数语法有变化,而且你没有指定分组依据:
- 直接写
nest(hand)的时候,函数会默认把每一行的hand单独嵌套成一个小tibble,所以得到了6行结果; - 警告信息提示你需要给嵌套的列命名,比如
data = c(hand),但这还不是你要的“一行数据”的核心问题——核心是你需要先按hand列分组,因为你所有的hand值都是相同的,分组后就只有一个组,嵌套后自然就是一行啦。
正确的方法一(按hand分组嵌套,保留其他数据)
这应该是最符合你需求的写法:先通过group_by(hand)把所有行归为一组,再用nest()把其他列嵌套到一个列表列里,结果就是一行数据:
library(dplyr) library(tidyr) players %>% group_by(hand) %>% nest()
执行后会得到这样的结果:
# A tibble: 1 x 2 hand data <chr> <list> 1 218755078355 <tibble [6 x 4]>
这里的data列是一个包含原始数据中seat、jugador、stack、posicion所有行的tibble,完全符合你“基于hand列嵌套得到一行”的需求。
如果你想让hand列本身是一个向量(包含所有6个值)
要是你的目标是让hand列变成一个长度为6的向量(哪怕里面的值都重复),同时其他列也保留为向量,那可以用summarize()结合list()来实现:
players %>% summarize(across(everything(), list), .groups = "drop")
这个代码会生成一行数据,每个列都是对应原始列所有值组成的向量,比如hand列就是c("218755078355", "218755078355", ...)(重复6次)。
再解释下警告信息
你看到的Warning message: All elements of ... must be named. Did you want data = c(hand)?是因为新版tidyr要求nest()的参数必须是“命名的列集合”,比如nest(hand_data = hand),但如果不分组的话,这个写法还是会生成6行,所以分组才是解决你问题的关键~
内容的提问来源于stack exchange,提问作者Ivan Cereghetti
相关产品推荐
相关产品推荐

