【发布时间】:2018-03-08 05:55:54
【问题描述】:
我想对嵌套数据框(存储为列表列)执行计算,并使用 purrr 函数将计算后的变量添加回每个数据框。我将使用此结果连接到其他数据,并保持其紧凑有助于我更好地组织和检查它。我可以通过几个步骤来做到这一点,但似乎有一个我没有遇到过的解决方案。如果有解决方案,我一直无法轻易找到。
加载库。示例需要以下软件包(在 CRAN 上可用):
library(dplyr)
library(purrr)
library(RcppRoll) # to calculate rolling mean
示例数据包含 3 个受试者,并随着时间的推移重复测量:
test <- data_frame(
id= rep(1:3, each=20),
time = rep(1:20, 3),
var1 = rnorm(60, mean=10, sd=3),
var2 = rnorm(60, mean=95, sd=5)
)
将数据存储为嵌套数据框:
t_nest <- test %>% nest(-id)
id data
<int> <list>
1 1 <tibble [20 x 3]>
2 2 <tibble [20 x 3]>
3 3 <tibble [20 x 3]>
执行计算。我将根据数据计算多个新变量,尽管稍后可以扩展仅针对一个变量的解决方案。每次计算的结果都会是一个数值向量,与输入的长度相同(n=20):
t1 <- t_nest %>%
mutate(var1_rollmean4 = map(data, ~RcppRoll::roll_mean(.$var1, n=4, align="right", fill=NA)),
var2_delta4 = map(data, ~(.$var2 - lag(.$var2, 3))*0.095),
var3 = map2(var1_rollmean4, var2_delta4, ~.x -.y))
id data var1_rollmean4 var2_delta4 var3
<int> <list> <list> <list> <list>
1 1 <tibble [20 x 3]> <dbl [20]> <dbl [20]> <dbl [20]>
2 2 <tibble [20 x 3]> <dbl [20]> <dbl [20]> <dbl [20]>
3 3 <tibble [20 x 3]> <dbl [20]> <dbl [20]> <dbl [20]>
我的解决方案是unnest这个数据,然后再nest。这似乎没有什么问题,但似乎可能存在更好的解决方案。
t1 %>% unnest %>%
nest(-id)
id data
<int> <list>
1 1 <tibble [20 x 6]>
2 2 <tibble [20 x 6]>
3 3 <tibble [20 x 6]>
这个其他解决方案 (from SO 42028710) 很接近,但不完全是因为它是一个列表而不是嵌套数据框:
map_df(t_nest$data, ~ mutate(.x, var1calc = .$var1*100))
我使用purrr Cheatsheet 找到了很多有用的信息,但找不到答案。
【问题讨论】: