我有两个数据帧列表,第一个dfs列表包含向下扩展列的值,第二个dfs列表包含单个值,如下所示:
dynamic_df_1 <- data.frame(x = 1:10)
dynamic_df_2 <- data.frame(y = 1:10)
df_list <- list(dynamic_df_1, dynamic_df_2)
df_list
static_df_1 <- data.frame(mu = 10,
stdev = 5)
static_df_2 <- data.frame(mu = 12,
stdev = 6)
static_df_list <- list(stat_df1 = static_df_1,
stat_df2 = static_df_2)
static_df_list
我想使用static_df_1和static_df_2中的值向每个数据帧(dynamic_df_1和dynamic_df_2)添加一列,以执行计算,其中dynamic_df_1的计算使用static_df_1进行计算,dynamic_df_2的计算使用static_df_2进行计算。
我想要的结果是:
df_list[[1]] <- df_list[[1]] %>%
mutate(z = dnorm(x = df_list[[1]]$x, mean = static_df_list$stat_df1$mu, sd = static_df_list$stat_df1$stdev))
df_list
df_list[[2]] <- df_list[[2]] %>%
mutate(z = dnorm(x = df_list[[2]]$y, mean = static_df_list$stat_df2$mu, sd = static_df_list$stat_df2$stdev))
df_list
我可以采用一种循环方法,在我的实际代码中会弄乱更复杂的功能:
for (i in 1:length(df_list)) {
df_list[[i]]$z <- dnorm(x = df_list[[i]][[1]], mean = static_df_list[[i]]$mu, sd = static_df_list[[i]]$stdev)
}
df_list
我正在尝试找到一个跨数据帧计算的lapply / map / mutate类型解决方案-想象一下一个数据帧网格,目标是跨行计算。还开放给其他解决方案,例如具有嵌套值的单个df,但尚未弄清楚该怎么做。
希望如此-我已尽力了! 谢谢!
答案 0 :(得分:1)
此Map
解决方案似乎更简单。结果为identical()
。创建df_list2
和df_list3
的代码如下。
df_list4 <- df_list
fun <- function(DF, Static_DF){
DF[["z"]] = dnorm(DF[[1]], mean = Static_DF[["mu"]], sd = Static_DF[["stdev"]])
DF
}
df_list4 <- Map(fun, df_list4, static_df_list)
identical(df_list2, df_list3)
#[1] TRUE
identical(df_list2, df_list4)
#[1] TRUE
数据。
运行创建初始df_list
的问题的代码后,运行dplyr
管道和for
循环代码:
df_list2 <- df_list
df_list2[[1]] <- df_list2[[1]] %>%
mutate(z = dnorm(x = df_list2[[1]]$x, mean = static_df_list$stat_df1$mu, sd = static_df_list$stat_df1$stdev))
df_list2[[2]] <- df_list2[[2]] %>%
mutate(z = dnorm(x = df_list2[[2]]$y, mean = static_df_list$stat_df2$mu, sd = static_df_list$stat_df2$stdev))
df_list3 <- df_list
for (i in 1:length(df_list3)) {
df_list3[[i]]$z <- dnorm(x = df_list3[[i]][[1]], mean = static_df_list[[i]]$mu, sd = static_df_list[[i]]$stdev)
}