【发布时间】:2016-09-05 11:02:49
【问题描述】:
我遇到了一个简单的问题,但找不到简单的解决方案。 (这个问题大概是duplicate但是找不到!)
我需要的是merge 在计算后将列表返回到其原始列表。
我需要merge,因为我正在做的计算太复杂,无法将apply 直接添加到列表中。所以,我必须分开做,并以某种方式将它放回原始数据集。 (因为这个问题,我不能在这里直接使用mutate)。
因为我无法复现我的数据,所以我将使用mtcars 来演示我的问题。
我有一个原始列表,我正在对其进行计算(无论哪个都没有关系),例如:
library(dplyr)
library(purr)
我的原始数据集是一个列表
dt = mtcars %>%
group_by(gear) %>%
split(.$gear)
然后,在这个列表上,我做一个计算,例如:
dt %>%
map(~summarise(., cluster = mean(disp)))
我最终得到了list。
我的数据的(真实)结构最终看起来像这样
$`3`
gear cluster
1 3 326.3
$`4`
gear cluster
1 4 123
等等。我需要的只是将merge back这个列表添加到原始列表中。
我怎样才能做到这一点 ?
我需要(想要的输出)最终得到(这里很难重现)我原来的list 和merged 计算值。
有点像
$`3`
mpg cyl disp hp drat wt qsec vs am gear carb cluster
1 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 XXX
2 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 XXX
3 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 XXX
4 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 XXX
所有列表以此类推(df)
我再次强调 我的原始数据集是一个列表而不是一个 data.frame。我需要的是合并lists,而不是data.frame。
我想到了类似的东西
dt = mtcars %>% # my data is a list
group_by(gear) %>%
split(.$gear)
fmerge = function(x) x %>% lapply(dt, ., by = 'gear')
dt %>%
map(~summarise(., cluster = mean(disp))) %>%
lapply(fmerge)
或
dt %>%
map(~summarise(., cluster = mean(disp))) %>%
join_all(dt, ., by = 'gear')
但是效果不好。
有什么线索吗?
【问题讨论】:
-
如果是这样,我的第一个解决方案应该可以工作
-
我不明白你如何在
map中使用summarise,但是你的情况对于mutate中的map来说太复杂了。如果您在map内将summarise替换为mutate,那么您以后就不必再加入了...