跨数据框的计算

时间:2018-11-07 06:28:54

标签: r for-loop dataframe lapply

我有两个数据帧列表,第一个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,但尚未弄清楚该怎么做。

希望如此-我已尽力了! 谢谢!

1 个答案:

答案 0 :(得分:1)

Map解决方案似乎更简单。结果为identical()。创建df_list2df_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)
}